2017-03-08 81 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由于这个隔离级别(或任何隔离)而无法运行。