博客
关于我
MySQL事务原理以及MVCC详解
阅读量:794 次
发布时间: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/

你可能感兴趣的文章
Mysql学习总结(48)——MySql的日志与备份还原
查看>>
Mysql学习总结(49)——从开发规范、选型、拆分到减压
查看>>
Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
查看>>
Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
查看>>
Mysql学习总结(51)——Linux主机Mysql数据库自动备份
查看>>
Mysql学习总结(52)——最全面的MySQL 索引详解
查看>>
Mysql学习总结(53)——使用MySql开发的Java开发者规范
查看>>
Mysql学习总结(54)——MySQL 集群常用的几种高可用架构方案
查看>>
Mysql学习总结(55)——MySQL 语句大全再温习
查看>>
Mysql学习总结(56)——MySQL用户管理和权限设置
查看>>
Mysql学习总结(57)——MySQL查询当天、本周、本月、上周、本周、上月、距离当前现在6个月数据
查看>>
Mysql学习总结(58)——深入理解Mysql的四种隔离级别
查看>>
Mysql学习总结(59)——数据库分库分表策略总结
查看>>
Mysql学习总结(5)——MySql常用函数大全讲解
查看>>
Mysql学习总结(60)——并发量大、数据量大的互联网业务数据库设计规范总结
查看>>
Mysql学习总结(61)——MySQL优化之DBA级优化整理汇总
查看>>
Mysql学习总结(62)——MySQL连接com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link问题
查看>>
Mysql学习总结(63)——Mysql数据库架构方案选择与分析
查看>>
Mysql学习总结(64)——Mysql配置文件my.cnf各项参数解读
查看>>
Mysql学习总结(65)——项目实战中常用SQL实践总结
查看>>