博客
关于我
MySQL事务:ACID特性的实现原理(redo log 与 undo log)
阅读量:527 次
发布时间:2019-03-08

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

ACID特性的实现原理

背景:什么是事务

在数据库系统中,事务是一组SQL操作,这组操作要么全部成功完成,要么全部失败 rollback。例如,转账操作需要扣除转出账户的金额并增加转入账户的金额,这两步操作必须同时成功或同时失败,否则数据可能处于不一致的状态,影响数据的完整性和一致性。

事务的作用

  • 可靠性:保证数据库在面对异常或服务器 crash时,能够回滚未提交的修改,确保数据的一致性。
  • 并发处理:允许多个事务并发执行,同时保证事务之间不会互相干扰,避免读取到未提交的修改数据(脏读)。
  • 隔离性:确保不同事务之间的操作不会互相影响,提供数据的一致性。
  • 实现事务的三大关键技术包括:

  • undo log(回滚日志):用于回滚事务-executed操作。
  • redo log(重做日志):用于持久化确保修改已写入磁盘。
  • 锁机制:用于控制并发访问,防止数据竞争。

  • ACID特性

    ACID是事务管理的四个核心特性,以下从原子性、持久性、隔离性和一致性四个方面详细分析。

    1. 原子性(Atomicity)

    原子性要求所有操作要么全部成功要么全部失败。这意味着如果在事务执行过程中出现错误或服务器 crash,所有已执行的修改都需要回滚至初始状态。

    实现 principle:

    • 基于undo log日志记录事务操作的详细信息。
    • 当需要回滚时,undo log日志会被用来撤销已执行的修改,恢复数据到事务开始前的状态。

    特点:

    • 不能分割,整个事务是一个不可拆分的单元。
    • 确保数据的完整性和一致性。

    2. 持久性(Durability)

    持久性要求一旦事务提交,所有修改将被永久保存到磁盘中,确保即使服务器 crash也不会丢失数据。

    实现 principle:

    • 使用 redo log 预写式日志技术。
    • 修改操作先记录在 redo log日志中,然后更新到 buffer pool。
    • 事务提交时,调用 fsync 操作将 redo log内容刷写到磁盘。

    特点:

    • 数据的持久化确保一致性,即使系统崩溃也能恢复。
    • Duplicate data 保持不变,确保事务结果的可靠性。

    3. 隔离性(Isolation)

    隔离性确保存在任何时候只有一个事务能够修改数据库中的数据,防止数据未提交前被其它事务读取(脏读)。

    实现 principle:

    • 基于锁机制和 MVCC(多版本并发控制)
    • 锁机制确保数据独占性,MVCC通过隐藏列和版本控制避免读取未提交的数据。

    隔离级别:

    • InnoDB默认隔离级别为可重复读(RR),其优点是兼通性和性能,缺点是无法完全防止幻读。
    • 更高的隔离级别(如可串行化 Serializable)虽然防止了幻读,但开销较大,通常不适用于高并发场景。

    4. 一致性(Consistency)

    一致性要求事务执行前后数据库状态保持一致,整个数据库处于合法状态。

    实现 principle:

    • 数据库内部约束(如主键、外键、索引等)和业务逻辑约束共同保证一致性。
    • 事务的原子性、持久性和隔离性都是确保一致性的基石。

    示例:

    • 转账操作前后,转出账户余额减少,转入账户余额增加。

    原子性详解

    undo log(回滚日志)

    undo log是实现原子性的核心技术,用于记录和撤销事务操作的日志。

    作用:

    • 记录事务修改的所有细节,如修改的行、列及之前值。
    • 在事务回滚时,根据这些日志恢复数据到未修改状态。

    示例:

    • 更新操作:undo log记录修改后的值和旧值。
    • 插入操作:undo log记录插入的行。

    redo log(重做日志)

    redo log用于持久化,确保数据写入磁盘。

    特点:

    • 基于预写式日志技术,所有修改先写入 redo log,然后才更新到 buffer pool。-刷脏(写入磁盘)通过 fsync 调用,确保数据持久化。

    隔离性详解

    锁机制

    InnoDB支持多种锁粒度,如行锁、表锁、页锁。默认情况下,InnoDB优先使用行锁,以提高并发 performance。

    锁类型:

  • 行锁:只锁定被修改的行,资源利用率高。
  • 表锁:锁定整个表,资源利用率低。
  • 页锁:锁定数据页,粒度介于行锁和表锁之间。
  • MVCC(多版本并发控制)

    MVCC通过隐藏列和版本号管理事务,并发读写,避免脏读和幻读。

    隐藏列:

    • 记录行的创建时间。
    • 记录行的删除时间。

    版本号:

    • 每次修改数据时,附加一个新的版本号。
    • 阅读操作根据版本号判断数据的修改版本,从而避免读取未提交的修改。

    总结

    ACID特性是数据库事务管理的核心机制,涵盖了数据操作的可靠性、最终一致性和原子性等关键点。通过 undo log、redo log、锁机制和 MVCC 等技术的结合,InnoDB 存储引擎能够高效地实现 ACID 特性,支持大规模的并发操作并保证数据的安全性和一致性。

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

    你可能感兴趣的文章
    Objective-C实现MATLAB中Filter函数功能(附完整源码)
    查看>>
    Objective-C实现matrix exponentiation矩阵求幂算法(附完整源码)
    查看>>
    Objective-C实现MatrixMultiplication矩阵乘法算法 (附完整源码)
    查看>>
    Objective-C实现max non adjacent sum最大非相邻和算法(附完整源码)
    查看>>
    Objective-C实现max subarray sum最大子数组和算法(附完整源码)
    查看>>
    Objective-C实现max sum sliding window最大和滑动窗口算法(附完整源码)
    查看>>
    Objective-C实现MaxHeap最大堆算法(附完整源码)
    查看>>
    Objective-C实现MaximumSubarray最大子阵列(Brute Force蛮力解决方案)算法(附完整源码)
    查看>>
    Objective-C实现MaximumSubarray最大子阵列(动态规划解决方案)算法(附完整源码)
    查看>>
    Objective-C实现maxpooling计算(附完整源码)
    查看>>
    Objective-C实现max_difference_pair最大差异对算法(附完整源码)
    查看>>
    Objective-C实现max_heap最大堆算法(附完整源码)
    查看>>
    Objective-C实现MD5 (附完整源码)
    查看>>
    Objective-C实现md5算法(附完整源码)
    查看>>
    Objective-C实现MeanSquareError均方误差算法 (附完整源码)
    查看>>
    Objective-C实现memcmp函数功能(附完整源码)
    查看>>
    Objective-C实现memoization优化技术算法(附完整源码)
    查看>>
    Objective-C实现memset函数功能(附完整源码)
    查看>>
    Objective-C实现merge insertion sort合并插入排序算法(附完整源码)
    查看>>
    Objective-C实现merge sort归并排序算法(附完整源码)
    查看>>