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 的插入?
提前致谢!
- 为什么会话 2 可以插入新数据?
在 REPEATABLE READ 下,第二个 SELECT 保证看到第一个 select 不变的行。可以通过并发事务添加新行,但不能删除或更改现有行。
- 为什么session 1能看到插入?
在 REPEATABLE READ 下,同一事务中的一致性读取读取由第一个 read.If 建立的快照您想要查看数据库的“最新”状态,请使用 READ COMMITTED 隔离级别或锁定读取,select ...更新是锁定读取。
一致的非锁定读取:https://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html
我的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 的插入? 提前致谢!
- 为什么会话 2 可以插入新数据?
在 REPEATABLE READ 下,第二个 SELECT 保证看到第一个 select 不变的行。可以通过并发事务添加新行,但不能删除或更改现有行。
- 为什么session 1能看到插入?
在 REPEATABLE READ 下,同一事务中的一致性读取读取由第一个 read.If 建立的快照您想要查看数据库的“最新”状态,请使用 READ COMMITTED 隔离级别或锁定读取,select ...更新是锁定读取。
一致的非锁定读取:https://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html