当使用select ...进行更新时,Mysql可重复读取得到其他会话的提交

时间:2017-08-08 03:31:19

标签: mysql isolation-level

我的表定义是

  

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的插入? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

  1. 为什么会话2可以插入新数据?
  2. 在REPEATABLE READ下,第二个SELECT保证看到第一次选择的行保持不变。并发事务可以添加新行,但不能删除或更改现有行。

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

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

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