作者回复: 你说的这种情况属于幻读。
当你INSERT的时候,也需要隐式的读取,比如插入数据时需要读取有没有主键冲突,然后再决定是否能执行插入。如果这时发现已经有这个记录了,就没法插入。
官方对幻读的定义是:The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times.
For example, if a SELECT is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row. (详见:
https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-locking.html )
需要说明下,不可重复读 VS 幻读的区别:
不可重复读是同一条记录的内容被修改了,重点在于UPDATE或DELETE
幻读是查询某一个范围的数据行变多了或者少了,重点在于INSERT
所以,SELECT 显示不存在,但是INSERT的时候发现已存在,说明符合条件的数据行发生了变化,也就是幻读的情况,而不可重复读指的是同一条记录的内容被修改了。
作者回复: 首先,不可重复读 和 幻读都是在先后两次读取的时候发现不一致的情况,但是两种读取略有差别:
不可重复读是对于同一条记录内容的“不可重复读”
幻读是对于某一范围的数据集,发现查询数据集的行数多了或者少了,从而出现的不一致。
所以不可重复读的原因是 对于要查询的那条数据进行了UPDATE或DELETE
而幻读是对于要查询的 那个范围的数据集,进行了INSERT。
作者回复: 多谢分享
作者回复: 一个好问题,一般来说第二个事务需要进行提交。不过在文章中,我将客户端1的隔离级别设置为了 读未提交,因此不论客户端2是否提交,都会对客户端1造成影响。
如果将客户端1的隔离级别设置为 读已提交,或者 可重复度。就需要对客户端2的事务进行提交,这时才会对客户端1在执行的事务产生影响。
作者回复: 解释的很好,大家都可以看下
作者回复: 不错
作者回复: 不可重复读 VS 幻读的区别:
不可重复读是同一条记录的内容被修改了,重点在于UPDATE或DELETE
幻读是查询某一个范围的数据行变多了或者少了,重点在于INSERT