MySQL事務詳解


事務:Transactionmysql

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

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


ACID測試:可以知足ACID測試就表示其支持事務,或兼容事務bash

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



MySQL事務的四個隔離級別session

wKioL1hUi7KgSR6NAAAjwSGtHkQ319.png-wh_50


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



隔離級別:ide

   READ UNCOMMITTED(讀未提交),性能

          髒讀(讀別人還沒有提交的數據),測試

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

          幻讀

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

   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

相關文章
相關標籤/搜索