MySQL的可重復讀是指在數據庫中,事務可以通過讀取已經提交的數據來確保數據的隔離性。也就是說,當多個并發事務在執行的時候,每一個事務都可以讀取其他事務已經提交的數據,而不會看到另一個未提交的事務所修改的數據。
可重復讀的實現基于數據庫的鎖機制。當一個事務需要讀取數據庫中的某個數據時,它將會獲得一個共享鎖(Shared Lock),這樣其他事務仍能讀取這個數據,但是不能修改這個數據。當一個事務需要修改數據庫中的某個數據時,它將會獲得一個排他鎖(Exclusive Lock),這樣其他事務既不能讀取數據也不能修改數據。
-- 如下是一個可重復讀的例子 SET AUTOCOMMIT=0; -- 關閉自動提交事務 START TRANSACTION; -- 開始事務 SELECT COUNT(*) FROM example WHERE status = 1; -- 查詢數據表的記錄數 -- 延遲 5 秒鐘,讓其他線程改變數據表的記錄數 -- 在此期間,事務 A 將留在可重復讀的隔離級別中 -- 在其他線程修改完記錄數之后,事務 A 再次查詢記錄數,結果應該不變 WAITFOR DELAY '00:00:05'; SELECT COUNT(*) FROM example WHERE status = 1; COMMIT; -- 提交事務
上面的代碼演示了一個使用可重復讀實現數據隔離的事務。首先,事務 A 開始一個新的事務,并執行了一個查詢語句,獲取了數據表中 status=1 的記錄數。接著,程序通過延遲 5 秒鐘的方式模擬了其他線程對數據表進行了更改。最后,事務 A 再次執行了同樣的查詢語句,并提交了事務。
在整個過程中,事務 A 都處于可重復讀的隔離級別中,即它能看到其他事務已提交的內容,但是看不到其他事務未提交的內容。因此,盡管在事務 A 執行期間,數據表的記錄數被其他線程修改了,但是事務 A 的查詢結果并沒有受到影響,也就是事務的隔離性得到了保障。