【发布时间】:2017-07-28 20:00:14
【问题描述】:
MySQL 事务的默认隔离级别是“Repeatable Read”。
根据另一个stackoverflow问题( 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。
非常感谢。
【问题讨论】:
标签: mysql sql transactions