我的表定义是
CREATE TABLE
auto_inc
(
id
int(11)NOT NULL AUTO_INCREMENT,PRIMARY KEY(
id
))ENGINE = InnoDB DEFAULT CHARSET = latin1
首先有四行:
| id |
| 1 |
| 2 |
| 3 |
| 4 |
我打开了会话1并执行了
#session 1
set transaction isolation level REPEATABLE READ
start transaction;
select * from auto_inc
返回四行1,2,3,4。然后我打开另一个会话2并执行
#session 2
insert into auto_inc(`id`) values(null)
并插入成功。回到会话1我执行了
#session 1
select * from auto_inc;#command 1
select * from auto_inc for update;#command 2
命令1返回四行1,2,3,4。但是命令2返回1,2,3,4,5。有人能给我一些线索,为什么命令2会看到会话2的插入? 提前谢谢!
答案 0 :(得分:0)
在REPEATABLE READ下,第二个SELECT保证看到第一次选择的行保持不变。并发事务可以添加新行,但不能删除或更改现有行。
https://stackoverflow.com/a/4036063/3020810
在REPEATABLE READ下,同一事务中的一致性读取读取第一次读取建立的快照。如果要查看数据库的“最新”状态,请使用READ COMMITTED隔离级别或锁定读取,以及select ... for update是一个锁定读取。
一致的非锁定读取:https://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html