2017-08-08 51 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