粗谈MySQL事务的特性和隔离级别 (2)

img

​​  可以看到,在界面1插入一条记录并且提交之后,界面2还是没有读到这个提交的数据,因为他是从事务开始时的快照表读取的所以自然是读不到的,但是在进行更新操作的时候则是更新了意料之外的记录,这就是一种幻读的现象。

​​  可串行化(serializable):意思就是事务要一个一个来,如果在一个事务中进行读操作,那么其他事务在该事务完成前只能进行读操作;如果进行写操作,那么其他事务的操作都进入等待(直到当前事务提交)。这种级别就可以防范目前出现的脏读、不可重复读、幻读等现象。如图

img

上图演示的是事务读时,其他事务不可写,下图是写时不可操作。

img

3 三个问题—脏读、不可重复读、幻读。

​​  这是采取事务的不同隔离级别可能产生的几个问题,在上面隔离级别已经提及到了,但是为了避免混淆还是单独拿出来。

脏读:指在一个事务中读到了其他事务还没提交的脏数据,发生在读未提交级别。

不可重复读:在一个事务中同样的查询可能出现不同的结果,发生在读未提交、读提交级别。(个人觉得没必要特意去理解为叫什么叫不可重复,容易混淆)

幻读:在一个事务中进行写操作的时候修改的数量跟预期的数量不同,例如修改到了之前查询不出来的数据。

​​  再啰嗦一些不可重复读和幻读的区别:可以理解为不可重复读是那条记录的字段值改变了,例如id为1的记录中name的两次值都不同;而幻读则是数量上的不同,例如我查询的时候共有2条记录,但是执行修改操作的时候却更新了3条。






参考:《高性能MySQL》,

或许我只是简单的想被认可。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfjpy.html