事务的隔离性
事务的隔离性:多个事务并发执行时不受到彼此干扰的特性。也就是说,不同用户的多个事务并发执行,一个用户的事务不会被另一个用户的事务干扰,多个并发事务间要相互隔离。
并发事务间的干扰
事务之间的相互干扰有三种:脏读、不可重复读和幻读。
- 脏读:一个事务读到了另一个事务未提交的数据。这里的危害主要在于如果另一个事务回滚了,没有提交数据,那么第一个事务就读到了不存在的数据。
- 不可重复读:一个事务内的多次查询的同一行记录的值不一样,行记录被修改(update)了。
- 幻读:一个事务内的多次查询的记录行数不一样,行记录的数量可能新增(insert)或减少(delete)了。
事务的隔离级别
四种隔离级别
为了解决事务并发带来的问题,才有了事务规范中的四个事务隔离级别,不同隔离级别对上面问题部分或者全部做了避免。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(Read Uncommit) | √ | √ | √ |
读已提交(Read Committed) | × | √ | √ |
可重复读(Repeatable Read) | × | × | √ |
串行化(Serialization) | × | × | × |
实现
InnoDB使用不同的锁策略(Locking Strategy)来实现不同的隔离级别:
- 读未提交:select不加锁,可能出现脏读;
- 读已提交:普通select快照读,锁select /update /delete 会使用记录锁,可能出现不可重复读;
- 可重复读:普通select快照读,锁select /update /delete 根据查询条件情况,会选择记录锁,或者间隙锁/临键锁,以防止读取到幻影记录;
- 串行化:串行化:select隐式转化为select ... in share mode,会被 update 与 delete 互斥;
适用场景
InnoDB默认的隔离级别是RR(可重复读),用得最多的隔离级别是RC(读已提交)