数据库之事务
ACID
Atomicity 原子性
Consistency 一致性
Isolation 隔离性
Durability持久性
MVCC(Mutil-Version Concurrency Control)
脏读、幻读、不可重复读
- 脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
- 不可重复读:是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
- 幻读:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
- 不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
- 幻读和不可重复读都是,读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
事务隔离级别
- Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
- Read committed (读已提交):可避免脏读的发生。
- Repeatable read (可重复读):可避免脏读、不可重复读的发生。
- Read uncommitted (读未提交):最低级别,任何情况都无法保证

数据库隔离级别
Repeatable read(可重复读)
产生间隙锁的条件(Repeatable Read事务隔离级别下):
- 使用普通索引锁定;
- 使用多列唯一索引;
- 使用唯一索引锁定多行记录
开启间隙锁

开启间隙锁
参考文章