博客
关于我
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如何实现ACID ?
查看>>
mysql如何记录数据库响应时间
查看>>
MySQL子查询
查看>>
Mysql字段、索引操作
查看>>
mysql字段的细节(查询自定义的字段[意义-行列转置];UNION ALL;case-when)
查看>>
mysql字段类型不一致导致的索引失效
查看>>
mysql字段类型介绍
查看>>
mysql字段解析逗号分割_MySQL逗号分割字段的行列转换技巧
查看>>
MySQL字符集与排序规则
查看>>
MySQL字符集乱码
查看>>
mysql字符集设置
查看>>
mysql存储IP地址的数据类型
查看>>
mysql存储中文 但是读取乱码_mysql存储中文乱码
查看>>
MySQL存储引擎
查看>>
MySQL存储引擎
查看>>
MySQL存储引擎--MYSIAM和INNODB引擎区别
查看>>
Mysql存储引擎(1):存储引擎体系结构和介绍
查看>>
Mysql存储引擎(2):存储引擎特点
查看>>
MySQL存储引擎--MyISAM与InnoDB区别
查看>>
mysql存储总结
查看>>