[高效能MYSQL學習筆記]事務

豎橫山發表於2021-05-14

徹底瞭解MYSQL事務
那些原子性,一致性,隔離性,永續性就不說了,主要說說innodb儲存引擎下面的事務

一. 隔離級別

Mysql的預設隔離級別是 REPEATABLE-READ (可重複讀) 可以透過一下命令檢視和修改

show variables like '%tx_isolation%' //檢視
set global transaction isolation level read committed; //全域性永久修改
set session transaction isolation level read committed;//修改當前會話

先來說說四個隔離級別

READ UNCOMMITTED (未提交讀)   不常用
除非真的有必要,實際應用中一般很少使用
假設現在兩個事務A,B同時開啟
事務A BEGIN之後  COMMIT之前  所做的INSERT,UPDATE,DELETE操作
事務B 都能SELECT到  
事務A 如果ROLLBACK,所做的INSERT,UPDATE,DELETE回滾 
事務B 剛剛SELECT的資料就是髒資料   簡稱 髒讀
SERIALIZABLE (可序列化)   不常用
最高階別事務,強制事務一個個地執行,同一個時間一個表只允許一個事務在執行
事務讀取到的資料都會加上行鎖,導致其他非事務的查詢不能正常執行,除非非常需要保證資料一致性,才考慮採用這個級別
 READ COMMITTED (提交讀)  支援MVCC
 假設現在兩個事務A,B同時開啟
 事務A BEGIN之後  COMMIT之前  所做的INSERT,UPDATE,DELETE操作
 事務B都查不到,此時事務B查到的是事務A開啟之前的引數
 假設現在事務A COMMIT,事務B還沒COMMIT,問題來了
 事務B第二次去SELECT就可以SELECT到事務A提交的資料了
 導致了同一個事務裡面兩次相同的SELECT,得到的結果不一致 簡稱不可重複讀
 可能會導致一些奇怪的事情
REPEATABLE READ (可重複讀) MYSQL INNODB 預設隔離級別 支援MVCC
INNODB透過MVCC(多版本併發控制)解決了上面的不可重複讀問題
事務A BEGIN, COMMIT之前,對每一行的INSERT,UPDATE,DELETE操作都會產生一條新的資料行,版本號是當前事務的ID,不影響原始的資料行
事務B 此時BEGIN 如果讀到有多版本的資料行(其他事務有INSERT,UPDATE,DELETE過的),也會對此資料行新增自己的版本號

結語

本文持續更新修正

本作品採用《CC 協議》,轉載必須註明作者和本文連結
遇強則強,太強另說

相關文章