說起事務,你肯定不會陌生。ACID你也肯定聽過,今天來記錄下我所理解的ACID中的“I”,即 隔離性。
首先,標準的SQL隔離級別有以下幾種:
1.可重複讀(repeatable read)。
2.讀未提交(read uncommitted)。
3.讀已提交(read committed)。
4.序列化(serializable )。
依次來解釋下:
1.可重複讀表示的是,在事務中任意一個階段,看到的值都是和事務啟動時的值一致。未提交變更,對其他事務不可見。
2.讀未提交指的是,未提交事務前的所有修改都對其他事務可見。
3.讀已提交指的是,已提交的事務後,其值才能被其他事務看見。
4.序列化指的是在讀取和更新時,都對這行資料進行加讀/寫鎖,其他事務無法訪問,必須等加鎖的事務執行完了才能訪問。
而在實際的實現過程中,資料庫使用了檢視來進行操作的。例如,
【可重複讀】資料庫會在事務開始時就建立一個檢視,此後事務中的所有操作都基於這個檢視。
【讀提交】是在每個sql開始執行時建立的檢視。
【讀未提交】則是直接返回最新值,因為它任何時候都能被其他事務看見。
【序列化】是用了加鎖來避免同時進行運算元據。
我們可以使用
show VARIABLES LIKE 'transaction_isolation';
來檢視當前資料庫使用的是哪種隔離級別。
例如博主這個就是【可重複讀】(REPEATABLE-READ)。
繼續深入一點了解,其實之所以可以有隔離級別,是因為Mysql的多版本併發控制(MVCC)。
在 MySQL 中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作。記錄上的最新值,通過回滾操作,都可以得到前一個狀態的值。
實際開發中,儘量不要使用長事務,因為這會導致非常龐大的回滾記錄日誌。建議都用顯示事務提交 begin commit,將自動提交 set autocommit設定為 1。
本作品採用《CC 協議》,轉載必須註明作者和本文連結