mysql第三天 事務,mysql第三天

來源:互聯網
上載者:User

mysql第三天 事務,mysql第三天
ACID

  • A : 原子性 要麼全提交成功,要麼全失敗復原
  • C:一致性 是從一個一致性狀態到另外一個一致性狀態。 意思就是說能量守恒。
    還有的人理解其是外鍵的定義,即對於有班級的學生,不能建立一個不指定班級的學生
    還有人認為一致性和原子性共同滿足了全好全壞的限定。
    我認為在分散式資料庫中這個概念才更有意義,如何做到多幾點的一致性
  • I:隔離性 跟隔離等級相關,通常來說,事物看不到其他未提交的事務的狀態
  • D:持久性 事務一旦提交,所做的修改就是永久儲存的
隔離等級先看一下事務並行作業可能遇到的問題:
  • 髒讀
    A 修改資料,未提交。 B讀取到了A修改後的資料, 如果A提交失敗那麼該修改就不會生效因此就造成了B讀取到了髒資料。
  • 不可重複讀取
    A事務兩次讀取同一行資料,B事務在兩次之間修改了資料並提交,導致了A前後兩次讀取資料的不一致。
    可以使用行鎖來解決,但是會減少效能,還可以使用MVCC策略解決
  • 幻讀
    A事務讀取範圍資料, B事務在範圍之間刪除或者新增了資料,A事務再次讀取該範圍時資料發生了變化。
    可以使用間隙鎖解決,還可以使用MVCC策略,這樣可以減少阻塞。
mysql 中設定隔離等級

my.ini

#選擇性參數有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.[mysqld]transaction-isolation = REPEATABLE-READ

當前session

SELECT @@tx_isolation;set transaction isolation level read uncommitted;set transaction isolation level read committed;    set transaction isolation level repeatable read;  set transaction isolation level serializable;

再看看隔離等級對應解決了的問題

READ UNCOMMITED
//session1set autocommit = 0;set transaction isolation level read uncommitted;begin;update biz_pay_task set pin = 'test1' where id=1;// session 2set autocommit = 0;set transaction isolation level read uncommitted;select * from biz_pay_task where id=1;// session1,2rollback;
  • 可以看到session2能夠讀取到未交的session1中的資料
  • 因此上面三個問題都有可能發生
READ COMMITED
// session 1,2 set transaction isolation level read committed; // session 1update biz_pay_task set pin = 'test1' where id=1;// session 2select * from biz_pay_task where id=1;// session 1commit;// session 2select * from biz_pay_task where id=1;rollback;
  • 可以看到session2隻能夠查看到sesssion1中已經提交了的變更。
  • 避免了髒讀
  • 很多資料庫預設都是這個層級
REPEATABLE READ
// session 1,2set transaction isolation level repeatable read;  begin;// session 1update biz_pay_task set pin = 'test2' where id=1;commit;// session 2select * from biz_pay_task where id=1;rollback;begin;select * from biz_pay_task where id between 1 and 3;// session 1begin; delete from biz_pay_task where id=2;// session 2select * from biz_pay_task where id between 1 and 3;// session 1commit;// session 2select * from biz_pay_task where id between 1 and 3;rollback;
  • session2事務開始後,session1所有的提交都對其沒有影響
  • 可重複讀這個隔離等級避免了 不可重複讀取以及幻讀的問題。
  • 幻讀問題本來並不是這個隔離等級能完成的,mysql通過mvcc的機制在這個隔離等級完成了
  • 是mysql的預設隔離等級
SERIALIZABLE

強制事務順序執行

交易記錄

mysql使用交易記錄來提高寫的效能,不是每次都用隨機IO來寫硬碟,
而是先寫記憶體,記錄硬碟一小塊地區順序io的寫日誌
另外有線程把交易記錄回寫回資料區域硬碟

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.