一.四个隔离级别 二.可重复读导致的幻读(亲测) 三.MVCC(Mutil-Version Concurrency Control)
在可重复读的隔离级别下,select是不能够查出其他事务已经提交的新增记录事务,那难道可重复读解决了幻读的问题吗?当然没有,隔离级别中,只有串行化隔离级别才解决了幻读。
一.四个隔离级别
先重温一下事务的隔离级别吧
Read Uncommitted(读取未提交内容)
在此隔离级别,所有事务都可以看到其他未提交事务的执行结果。
例如:程序员发现自己工资卡入账8000¥,他很开心,这个月咋这么多。可是下一秒,老板发现工资发错了,等他算算具体多少¥再说,然后反手就把这笔8000流水回滚了。当程序员再去看余额想让自己开心一下的时候,发现这个时候卡里只剩下了个寂寞,晚上,伤心的猿站在天台,点了支烟,自己抽一半,风也抽一半。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
例如:程序员又在看自己的余额,发现两次查看的余额不一样,余额的数字咋还变多了。原来老板突然发现忘了给他发去年年终,给他结工资的事务提交了以后,在程序员第二次看余额之前,又提交了一个补发去年年终奖的事务更新了他的余额。