博客
关于我
MySQL事务原理以及MVCC详解
阅读量:793 次
发布时间:2023-02-11

本文共 1596 字,大约阅读时间需要 5 分钟。

MySQL事务原理与MVCC详解

1. 事务的基础概念

在数据库管理系统中,事务是执行过程中的一个逻辑单位。它将一组数据库操作序列作为一个不可分割的整体进行执行。例如,在ATM转账时,系统需要同时完成转出账户扣款和转入账户加款两个操作,这两个操作必须作为一个整体完成,要么同时成功,要么同时失败。

ACID特性

事务具有四大特性(ACID):

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,所有数据保持一致状态。
  • 隔离性(Isolation):防止并发事务之间的干扰。
  • 持久性(Durability):事务提交或回滚后,数据改变是永久的。

2. 并发事务问题

当多个事务同时操作同一张表或数据库时,可能会引发以下并发问题:

  • 脏读(Dirty Read):一个事务读到其他未提交事务的数据。
  • 不可重复读(Non-Repeatable Read):一个事务在两次读取同一条记录时,得到的数据不同。
  • 幻读(Phantom Read):一个事务按照条件查询时发现无对应数据,但在插入数据时发现该数据已存在。

3. 隔离级别

MySQL定义了四种事务隔离级别,控制事务之间的可见性影响:

隔离级别 脏读 不可重复读 幻读 实现机制 典型应用场景
读未提交 (RU) 允许 允许 允许 直接读取内存页最新数据 统计类查询
读已提交 (RC) 禁止 允许 允许 每次查询生成新ReadView (MVCC) 高并发OLTP系统
可重复读 (RR) 禁止 禁止 否定 事务开始时生成ReadView (MVCC+间隙锁) MySQL默认
串行化 (Serializable) 禁止 禁止 否定 完全锁表(读写互斥) 金融交易等强一致性场景

:MySQL在RR级别通过Next-Key Lock(间隙锁+行锁)避免幻读,但标准SQL规范中RR允许幻读。

4. 事务原理

日志文件

MySQL包含两个日志文件:

  • 重做日志(Redo Log):保证事务的持久性。
  • 回滚日志(Undo Log):保证事务的原子性,并支持MVCC。

重做日志

重做日志记录事务提交时数据页的物理修改,用于实现持久性。重做日志由重做日志缓冲(内存)和重做日志文件(磁盘)组成。

回滚日志

回滚日志记录数据修改前的信息,用于事务回滚和MVCC。回滚日志采用段管理,存储1024个undo log segment。

隔离性实现

隔离性基于锁机制和MVCC。

5. MVCC(多版本并发控制)

MVCC通过维护数据的多个版本,实现读写无冲突。MVCC依赖三个隐式字段、undo log和readView。

隐式字段

数据库表自动生成三个隐式字段:

  • DB_TRX_ID:记录修改事务ID。
  • DB_ROLL_PTR:回滚指针,指向上一个版本。
  • DB_ROW_ID:隐藏主键。

Undo Log版本链

每次修改生成新的版本,通过DB_ROLL_PTR形成版本链。回滚时根据版本链恢复数据。

ReadView

ReadView记录活跃事务ID列表,用于判断数据可见性。生成ReadView时机根据隔离级别:

  • READ COMMITTED:每次快照读生成ReadView。
  • REPEATABLE READ:仅在第一次快照读生成ReadView。

数据可见性判断

通过DB_TRX_ID与ReadView对比,确定数据版本。不可见时,沿版本链查找下一个可见版本。

6. RR可重复读的实现机制

在RR隔离级别中,生成ReadView用于防止两次读取数据不一致,确保数据一致性。


本文详细解析了MySQL事务原理与MVCC,结合ACID特性、并发问题及隔离级别,深入探讨了事务的持久性、原子性以及MVCC的实现机制,为理解和应用MySQL事务提供了全面的理论基础。

转载地址:http://zabfk.baihongyu.com/

你可能感兴趣的文章