博客
关于我
MySQL底层概述—9.ACID与事务
阅读量:794 次
发布时间:2023-02-12

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

ACID 原子性、持久性、隔离性、一致性及事务控制机制解析

数据库事务管理是保障数据一致性和完整性的核心机制,而 ACID(原子性、一致性、隔离性、持久性)四个特性是关系型数据库事务的基础。通过对 ACID 特性的深入理解和 MySQL 中的事务控制机制,可以更好地掌握数据库事务的实现原理和性能优化方法。


1. ACID 之 原子性

原子性(Atomicity)是数据库事务的基本特性,确保所有事务操作要么全部执行,要么全部不执行。具体实现方式是通过 Redo日志Undo日志

  • Redo日志 记录事务提交前修改的数据,确保在系统崩溃后能够恢复已提交的事务。
  • Undo日志 记录事务未提交时对数据的修改,允许在事务回滚时恢复数据到未提交前的状态。

通过二阶段提交(Prepare 和 Commit),Redo日志的状态从 Prepare 转为 Commit,确保事务操作的原子性。


2. ACID 之 持久性

持久性(Durability)保证事务提交后对数据库的修改永久生效,即使系统崩溃也不会丢失数据。

MySQL 的持久性依赖于 Redo日志Binlog

  • Redo日志 是物理层面的持久性保证,刷盘后即可恢复。
  • Binlog 是逻辑日志,用于数据恢复,但单独依赖 Binlog 无法实现 Crash-safe。

InnoDB 引擎通过 Redo日志 实现 Crash-safe 能力,通过日志的 LSN(Log Sequence Number)和 Checkpoint 机制判断日志是否已刷盘。


3. ACID 之 隔离性

隔离性(Isolation)防止并发事务之间的干扰,常见问题包括脏读、不可重复读和幻读。

隔离性实现方式

  • 锁机制:通过加锁(如排他锁、读写锁)解决脏写问题。
  • MVCC:通过多版本并发控制解决脏读和幻读问题。

InnoDB 支持四种隔离级别,从低到高依次为:Read Uncommitted、Read Committed、Repeatable Read、Serializable。


4. ACID 之 一致性

一致性(Consistency)确保事务开始前和结束后数据库状态一致,依赖于 ACID 的组合实现。

  • 约束一致性:由外键、唯一索引等约束保证。
  • 数据一致性:由原子性、持久性、隔离性共同保证。

一致性可以理解为数据的完整性,而其实现依赖于 Redo/Undo 日志机制。


5. ACID 的关系

事务的持久化是应对系统崩溃时数据丢失的解决方案,而 ACID 的一致性确保了事务执行结果的正确性。在非并发环境下,仅需保证原子性即可保证一致性;而在并发环境下,需结合原子性和隔离性。


6. 事务控制演进之 排队

排队处理 是最简单的并发控制方法,通过全局排队序列化事务执行,特点是强一致性,性能较低。这种方式适用于对并发处理要求不高的场景。


7. 事务控制演进之 排他锁

排他锁 是事务控制的基础,用于解决并发事务对数据项的竞争。排他锁确保同一数据项在任何时刻只能被一个事务占用,其他事务被阻塞等待。


8. 事务控制演进之 读写锁

读写锁 是排他锁的扩展,对读和写操作进行粒度化管理:

  • 读读:允许同时读取。
  • 写写:允许同时写入。
  • 读写写读:需加锁。

读写锁提升了并发处理能力,减少锁竞争。


9. 事务控制演进之 MVCC

MVCC(多版本并发控制) 是现代数据库事务控制的核心机制,通过隐藏字段和 Undo日志实现高并发读写。

MVCC 组成部分

  • Hidden Fields:包括 DATA_TRX_IDDATA_ROLL_PTRDB_ROW_IDDELETE_BIT
  • Undo日志:记录事务操作的历史版本,支持事务回滚。
  • Read View:用于实现 RC 和 RR 隔离级别,确保一致性读取。

MVCC 读操作

  • 快照读:基于历史版本读取数据,避免加锁。
  • 当前读:加锁读取最新数据,用于写操作和高隔离级别。

10. 事务隔离级别之 隔离级别的类型

MySQL 支持四种隔离级别:

隔离级别 脏读 不可重复读 幻读 特点
Read Uncommitted Y N N 最低隔离级别,性能最佳。
Read Committed Y Y N 提高一致性,防止脏读。
Repeatable Read Y Y Y 提高一致性,减少幻读。
Serializable N N N 最高隔离级别,通过锁强制串行化。

隔离级别越高,系统性能越差,但并发问题越少。


11. 事务隔离级别之 和锁的关系

锁机制 是事务隔离性实现的基础,通过加锁防止数据竞争。事务隔离级别决定了锁的粒度和类型。


12. 事务隔离级别之 MySQL隔离级别控制

MySQL 默认隔离级别为 Repeatable Read,可以通过以下命令调整:

set tx_isolation='READ-UNCOMMITTED';set tx_isolation='READ-COMMITTED';set tx_isolation='REPEATABLE-READ';set tx_isolation='SERIALIZABLE';

通过对 ACID 特性的理解和 MySQL 中事务控制机制的掌握,可以更好地优化数据库事务性能,确保数据一致性和系统稳定性。

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

你可能感兴趣的文章
mysql出现错误的解决办法
查看>>
MySQL函数
查看>>
mysql函数汇总之字符串函数
查看>>
mysql函数汇总之数学函数
查看>>
mysql函数汇总之日期和时间函数
查看>>
mysql函数汇总之条件判断函数
查看>>
mysql函数汇总之系统信息函数
查看>>
MySQL函数简介
查看>>
mysql函数遍历json数组
查看>>
MySQL函数(转发)
查看>>
mysql分区表
查看>>
MySQL分层架构与运行机制详解
查看>>
mysql分库分表中间件简书_MySQL分库分表
查看>>
MySQL分库分表会带来哪些问题?分库分表问题
查看>>
MySQL分组函数
查看>>
MySQL分组查询
查看>>
Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间
查看>>
mySql分页Iimit优化
查看>>
MySQL分页查询
查看>>
mysql列转行函数是什么
查看>>