MySQL 的隔離級別 自理解

rocketeer發表於2022-02-07

說起事務,你肯定不會陌生。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';

來檢視當前資料庫使用的是哪種隔離級別。

Python

例如博主這個就是【可重複讀】(REPEATABLE-READ)。

繼續深入一點了解,其實之所以可以有隔離級別,是因為Mysql的多版本併發控制(MVCC)。

在 MySQL 中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作。記錄上的最新值,通過回滾操作,都可以得到前一個狀態的值。

實際開發中,儘量不要使用長事務,因為這會導致非常龐大的回滾記錄日誌。建議都用顯示事務提交 begin commit,將自動提交 set autocommit設定為 1。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
純陽太極兩儀四象八卦圈

相關文章