默認隔離級別是「可重複讀」。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。
非常感謝。