脏读: (读取了未提交的新事物,然后被回滚了)
事务A读取了事务B中尚未提交的数据。如果事务B回滚,则A读取使用了错误的数据。
不可重复读: (读取了提交的新事物,指更新操作)
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
相信上面那段话很多人都看过,这也是国内帖子最常见的说法,我个人因为这种解释的方法混淆了很久,我觉得这种表述不太直观,不太容易让人理解,原因是,他把主角(我)的视角多次转化了,从我作为一个入侵别人事务的角色,转化成被别人入侵事务的角色。
于是我总结出一下描述。
不管是脏读还是不可重复读,本质上都是一个线程入侵了另一个线程的事务(未提交)。
第一种(脏读),入侵了别人的事务,主要是读这个动作,也是这个隔离机制相对应的读锁的核心概念,记住读就行。再把这个读放回本质上去。那就是我读了一个未提交的事务(一个线程入侵了另一个线程的事务)。
第二种(不可重复读),很多时候被这个读所蒙蔽了,这种情况的重点恰恰是写的本质。也就是我在一个未提交的事务的过程中写了,并且提交了,令对方不可重复读。(这个时候,我们的角色没有改变,一直都是入侵者)
第三种(可重复读),很简单,就是非事件,也就是上读锁和写锁,也就是行锁。
第四种(幻读),他的本质是表级和行级的区别,可以理解为行锁的范围加大版,表级锁,记住这个本质就OK了。
在解释过程中举例当然好,但是我发现很多帖子在举例时,容易忽略角色的问题,导致例子越多,越难懂混淆。