0%

事务隔离

学习目标

MySQL03

  • 四种事务隔离级别以及应用场景
  • 事务的实现机制和 MVCC
  • 长事务的风险

事务隔离级别

  • 读未提交(read uncommitted)
    事务 A 可以读到事务 B 未提交的内容
  • 读提交(read committed)
    事务 A 只能读到事务 B 提交后的内容
    Oracle 默认隔离级别
  • 可重复读(repeatable read)
    事务 A 只能读到事务 A 开启时事务 B 所提交的内容
    MySQL 默认隔离级别
    比如可以用于数据校对
  • 串行化(serializable)
    加锁, 每次保证只有一个事务能够执行.

隔离级别越高, 数据库性能越差.

事务实现机制

MVCC, 多版本并发控制, 同一条记录在系统中可以存在多个版本.

MySQL 中读提交和可重复读两种级别下是通过创建视图来实现事务隔离的.

  • 读提交时, 视图在每条 SQL 开始执行时创建的;
  • 可重复读时, 视图是在每个事务开启时创建的, 整个事务期间都会使用这个视图;

在 MySQL 中, 每条记录在被更新时, 同时也会创建一个回滚操作. 这样记录中的最新值就可以通过该回滚操作, 得到原来状态下的值.

这样, 在可重复读隔离级别下, 事务 A 更新了记录 R1, 会生成一个回滚操作记录 RB1, 这时事务 B 进来会生成一个视图 read_view1, 事务 B 可以在 read_view1 中根据 RB1 的回滚操作来访问记录 R1 在被事务 A 更新前的记录值了.

只有当系统判断, 不会再有事务会用到这些回滚日志的时候, 这些日志才会被删除.

长事务风险

长事务, 也就意味着其中的回滚日志都需要保留, 占用系统存储空间.
同时, 长事务也会占用锁资源, 导致数据库性能下降.