徹底瞭解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 協議》,轉載必須註明作者和本文連結