博客
关于我
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/

你可能感兴趣的文章
Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间
查看>>
mySql分页Iimit优化
查看>>
MySQL分页查询
查看>>
WebDriverException:未知错误:对于旧版本的 Google Chrome,在 Python 中找不到带有 Selenium 的 Chrome 二进制错误
查看>>
mysql列转行函数是什么
查看>>
mysql创建函数报错_mysql在创建存储函数时报错
查看>>
mysql创建数据库和用户 并授权
查看>>
mysql创建数据库指定字符集
查看>>
MySql创建数据表
查看>>
MySQL创建新用户以及ERROR 1396 (HY000)问题解决
查看>>
MySQL创建用户与授权
查看>>
MySQL创建用户报错:ERROR 1396 (HY000): Operation CREATE USER failed for 'slave'@'%'
查看>>
MySQL创建索引时提示“Specified key was too long; max key length is 767 bytes”
查看>>
mysql初始密码错误问题
查看>>
MySQL删除数据几种情况以及是否释放磁盘空间【转】
查看>>
Mysql删除重复数据通用SQL
查看>>
mysql判断某一张表是否存在的sql语句以及方法
查看>>
mysql加入安装策略_一键安装mysql5.7及密码策略修改方法
查看>>
mysql加强(1)~用户权限介绍、分别使用客户端工具和命令来创建用户和分配权限
查看>>
mysql加强(2)~单表查询、mysql查询常用的函数
查看>>