2017-03-08 85 views
1

默認隔離級別是「可重複讀」。MySQL的重複讀「交易異常行爲MySQL的交易

根據另一個計算器問題( Difference between read commit and repeatable read) 「可重複讀是一個更高的隔離級別,即除了提交讀級別的保障,同時也保證了所有數據的讀取不能改變,如果事務讀取同樣的數據,它會找到之前讀取的數據,保持不變,並可供讀取。「

這裏是我的測試數據庫;

mysql> select * from people; 
+------+---------+ 
| name | howmany | 
+------+---------+ 
| alex |  100 | 
| bob |  100 | 
+------+---------+ 

slow.sql

START TRANSACTION; 

SELECT @new_val := howmany FROM people WHERE name = 'alex'; 
SELECT SLEEP(10); 
SET @new_val = @new_val - 5; 
UPDATE people SET howmany = @new_val WHERE name = 'alex'; 

COMMIT; 

fast.sql

START TRANSACTION; 

SELECT @new_val := howmany FROM people WHERE name = 'alex'; 
-- SELECT SLEEP(10); 
SET @new_val = @new_val - 5; 
UPDATE people SET howmany = @new_val WHERE name = 'alex'; 

COMMIT; 

如果我運行slow.sql,並返回之前,我跑fast.sql多次。 fast.sql將打印95,90,85 ....

我認爲可重複讀取隔離級別應使fast.sql無法運行或誤解'可重複讀取'。

我從Ubuntu的16.10運行MySQL 5.7。

非常感謝。

回答

2

如果沒有錯的,然後大約一致Repeatable Read會談在同一事務中,不與其他事務讀取。從MySQL Documentation

  • 重複讀

這是InnoDB的默認隔離級別。一致讀取相同的事務中 讀取由第一 讀取建立快照。這意味着,如果您在同一個事務中發出多個普通(非鎖定)SELECT 語句,則這些SELECT語句也相對於對方而言是一致的 。

0

如果在您的事務處理期間某些數據在其外部的進程中發生更改,它將不會影響上述事務中讀取的數據。

我看不到fast.sql由於這個隔離級別(或任何隔離)而無法運行。