MySQL事務詳解


事務:Transaction

    多個sql語句,要麼同時都執行,要麼同時都不執行

    事務就是一組原子性的(select)查詢語句,也即將多個查詢當作一個獨立的工作單元


ACID測試:能夠滿足ACID測試就表示其支持事務,或兼容事務

A:Atomicity,原子性,都執行或者都不執行
C:Consistency,一致性,從一個一致性狀態轉到另外一個一致性狀態
I:Isolaction,隔離性。一個事務的所有修改操作在提交前對其他事務是不可見的
D: Durability, 持久性,一旦事務得到提交,其所做的修改會永久有效



MySQL事務的四個隔離級別

wKioL1hUi7KgSR6NAAAjwSGtHkQ319.png-wh_50


安全性越高,併發性越低(接近串行)



隔離級別:

   READ UNCOMMITTED(讀未提交),

          髒讀(讀別人尚未提交的數據),

          不可重複讀(兩次讀同一個數據,得到的結果可能不一樣,別人可能正在修改)

          幻讀

          (數據安全性最低,併發性最高)

   READ COMMITTED(讀提交)

   REPEATABLE READ (可重讀) --> mysql 解決了髒讀

   SERIALIZABLE(可串行化)強制事務的串行執行避免了幻讀;性能極低


注:MyISAM存儲引擎不支持事務


啓動事務
   mysql > start transaction
事務提交
   mysql > commit
//所有執行都生效


啓動事務
   mysql > start transaction
事務回滾
   mysql > rollback
   mysql > SAVEPOINT identifier 控制回滾的位置
   mysql > ROLLBACK [WORK] TO [SAVEPOINT] identifier  回滾到指定位置
      //放棄剛剛的某些操作



E.G
  mysql> start transaction;
  mysql> select * from tests;


wKiom1hVGN2jsKBVAABF8TmVdUw304.png-wh_50

 

  mysql> delete from tests where sid=6;
  mysql> savepoint a; --> 設置保存點名稱
  mysql> delete from tests where sid=4;
  mysql> savepoint b;
  mysql> delete from tests where sid=9;
  mysql> savepoint c;
  mysql> select * from tests;


wKioL1hVGMjR3KDGAACBgf5Ybv8519.png-wh_50

 

  mysql> rollback to b;
  mysql> select * from tests;


wKiom1hVGKaRVTcUAADr6Z_7JRo124.png-wh_50

  mysql> rollback to a;
  mysql> select * from tests


wKioL1hVGIrTka_KAABCWrA9UCM162.png-wh_50


  mysql> rollback; --> 全部恢復
  mysql> select * from tests;


wKiom1hVGGiDb7j9AADMbQ69MkA436.png-wh_50



如何沒有顯式啓動事務,每個語句都會當作一個默認的事務,其執行完成會被自動提交

mysql> show variables like 'autocommit';


wKiom1hVGEvAjUN1AAASqGmwqzY905.png-wh_50


mysql > set session autocommit = 0;  --> 手動關閉自動提交功能
注意 關閉自動提交,請記得手動提交事務


查看mysql的事務隔離級別

show global  variables like '%iso%'
select @@global.tx_isolation


wKioL1hVGBqjwXJFAAEOFVQ7Qeo595.png-wh_50


mysql> set global tx_isolation='READ-UNCOMMITTED';
//修改級別 READ-UNCOMMITTED


測試MySQL的四個隔離級別及其重現問題(兩個終端中測試)


讀未提交測試

wKiom1hVF-bCFDepAACq3CGKS7o383.png-wh_50


讀提交測試

wKiom1hVF8CAd6VcAALblA4Yob4059.png-wh_50



可重讀測試

wKiom1hVF4eiSPJXAACXbe8n91A492.png-wh_50


wKioL1hVF4egCGNkAACiq1aWQKg900.png-wh_50



串行化測試

wKioL1hVF1HAt47qAADXSEX6ORY336.png-wh_50



建議:對事物要求不特別嚴格的場景下,可以使用讀提交

修改要想永久有效;修改配置文件



MVCC:多版本併發控制

    每個事務啓動時,InnoDB會爲每個啓動的事務提供一個當下時刻的快照

    爲實現此功能,InnoDB會爲每個表提供兩隱藏的字段,一個用於保存行的創建時間,

    一個用於保存行的失效時間


    旨在兩個隔離級別下有效:read committed和repeatable read



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章