关键字:隔离性、幻读、间隙锁
1、并发的事务之间是互不干扰的,它们之间是隔离进行。这是事务的隔离性的体现。
2、事务的四种隔离级别&&三种问题:
(1)四种隔离级别:读未提交、读提交、可重复读、串行化
(2)三种问题: 脏读、不可重复读、幻读
详细分析:http://blog.sina.com.cn/s/blog_499740cb0100ugs7.html
3、对比分析:
(1)可重复读&&不可重复读:
可重复读:指的是一个事务可以读取其他事务的更新,但是第一次读取到的数据,就算下次读取别的事务时,该事务已经对这个数据进行更新了,当前事务还是保持第一次读取的那个数据,也就可以抽象认为可以重复读到相同的数据。在这个隔离级别之下,只有当前事务提交之后,才能够读取到其他事务的提交。(冲突就发生在这个时刻)
不可重复读:指的是数据不可重复读,别的事务一旦更新了这个数据,那么当前事务也需要更新这个数据,不可以再读到之前的那个数据。在同一个事务中,两次读取的数据不一致。
对比:
①可重复读时隔离级别; 不可重复读是一种现象;
②对于可重复读:当前事务未提交时,不可以读取到其他事务的commit,只能重复读取第一次读取的commit的内容;
对于不可重复读:当前事务未提交时,可以读取到其他事务的commit,每次都是读取到别的事务最新提交的内容;
(2)Repeatable Read && 幻读:
数据库的四种隔离级别在不同数据库中的实现是不同的,在mysql中,在实现Repeatable Read这个隔离级别的时候,已经解决了幻读的问题了。(虽然SQL标准中没有要求解决幻读,但是innodb中解决了)
怎样解决幻读?
①对于更新操作,都会加X锁,所以别的事务没办法进行更新操作,所以不会出现幻读;
②但是对于读操作:innodb默认不会加S锁,采用MVCC(等价于读锁)进行控制,同时添加了间隙锁(gap锁)。
(“间隙锁”分析:https://www.cnblogs.com/bestvish/p/10518553.html)
(3)innodb下的Repeatable Read和串行化的区别:
前提:假设有两个并发事务A、B:
①RR隔离级别:
a、事务A写,会加X锁,事务B只能读;
b、事务A读,对于当前读的记录,通过MVCC进行控制,对当前记录的间隙加gap锁(等价于S锁)。此时事务B没办法写,只能读。
②串行化级别:不管是读还是写,都是串行化的,在某个事务读或者写的时候,别的事务是没办法读或者写的。
原文地址:https://www.cnblogs.com/axing-articles/p/11366890.html