事务的隔离性

事务的隔离性

事务的隔离性:多个事务并发执行时不受到彼此干扰的特性。也就是说,不同用户的多个事务并发执行,一个用户的事务不会被另一个用户的事务干扰,多个并发事务间要相互隔离。

并发事务间的干扰

事务之间的相互干扰有三种:脏读、不可重复读和幻读。

  • 脏读:一个事务读到了另一个事务未提交的数据。这里的危害主要在于如果另一个事务回滚了,没有提交数据,那么第一个事务就读到了不存在的数据。
  • 不可重复读:一个事务内的多次查询的同一行记录的值不一样,行记录被修改(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(读已提交)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容