Mysql 使用时可重复读取获取其他会话的提交 select ...更新

Mysql repeatable read get other session's commit when use select ...for update

我的table的定义是

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

return 四行 1,2,3,4.And 然后我打开另一个会话 2 并执行

#session 2
insert into auto_inc(`id`) values(null)

并将 success.Back 插入我执行的会话 1

#session 1
select * from auto_inc;#command 1
select * from auto_inc for update;#command 2

命令 1 return 四行 1,2,3,4.But 命令 2 return 1,2,3,4,5.Could 谁能给我一些线索为什么命令 2 会看到会话 2 的插入? 提前致谢!

  1. 为什么会话 2 可以插入新数据?

在 REPEATABLE READ 下,第二个 SELECT 保证看到第一个 select 不变的行。可以通过并发事务添加新行,但不能删除或更改现有行。

  1. 为什么session 1能看到插入?

在 REPEATABLE READ 下,同一事务中的一致性读取读取由第一个 read.If 建立的快照您想要查看数据库的“最新”状态,请使用 READ COMMITTED 隔离级别或锁定读取,select ...更新是锁定读取。

一致的非锁定读取:https://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html