2017-08-08 39 views
0

我的表的定义是Mysql的重复读得在使用时选择其他会议的承诺... FOR UPDATE

CREATE TABLE auto_inc

id INT(11)NOT NULL AUTO_INCREMENT,

PRIMARY KEY(id

)ENGINE = InnoDB的默认字符集= 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.And然后我打开另一个会话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.But命令2返回1,2,3,4,5。任何人都可以给我一些线索为什么命令2会看到会话2的插入? 在此先感谢!

回答

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

在REPEATABLE下读取第二个SELECT保证查看在第一个选择的行中选择的行保持不变。新行可以通过并发事务添加,但现有行不能删除也不能更改。

https://stackoverflow.com/a/4036063/3020810

  • 为什么会话1可以看到插入?
  • 下重复读,一致在同一事务中读取读出由第一读取建立的快照。如果要查看数据库的“最新”状态,请使用READ COMMITTED隔离级别或锁定读取,并且select ... for update是锁定读取。

    一致Nonlocking阅读:https://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html