事务的 ACID 特性详解

ACID 是事务的四大核心特性,确保数据库操作的可靠性和一致性:


(1) 原子性(Atomicity)
  • 定义:事务是一个不可分割的最小操作单元,要么全部成功,要么全部失败回滚。
  • 实现机制
    • Undo Log(回滚日志):记录事务修改前的数据旧版本,用于回滚时恢复原始状态。
    • 事务回滚流程
      BEGIN;
      UPDATE accounts SET balance = balance - 100 WHERE user = 'A'; -- 操作1
      UPDATE accounts SET balance = balance + 100 WHERE user = 'B'; -- 操作2
      -- 若此时系统崩溃,重启后通过 Undo Log 撤销未提交的操作1和操作2
      COMMIT;
  • 示例:转账操作中,扣款和加款必须同时成功或失败。

(2) 一致性(Consistency)
  • 定义:事务执行后,数据库从一个一致状态转换到另一个一致状态(如数据完整性约束不被破坏)。
  • 实现机制
    • 数据库约束:通过主键、外键、唯一约束、检查约束等保证数据合法性。
    • 业务逻辑:应用层需确保事务逻辑符合业务规则(如余额不能为负数)。
  • 示例:转账前后,账户总金额应保持不变(A-100,B+100)。

(3) 隔离性(Isolation)
  • 定义:并发事务之间互不干扰,每个事务感觉不到其他事务在并行执行。

  • 隔离级别

    级别脏读不可重复读幻读实现方式
    读未提交无锁,直接读最新数据。
    读已提交快照读(MVCC)或行锁。
    可重复读(默认)MVCC + 间隙锁(InnoDB)。
    串行化全表锁,强制事务串行执行。
  • 问题说明

    • 脏读:读到其他事务未提交的数据。
    • 不可重复读:同一事务内多次读取同一数据,结果不一致(因其他事务修改)。
    • 幻读:同一事务内多次查询,结果集行数变化(因其他事务插入/删除)。

(4) 持久性(Durability)
  • 定义:事务提交后,修改永久保存,即使系统崩溃也不丢失。
  • 实现机制
    • Redo Log(重做日志):记录事务修改后的数据新版本,按顺序写入磁盘。
    • 刷盘策略
      • 参数 innodb_flush_log_at_trx_commit 的取值及含义

        行为持久性性能
        1每次事务提交时,将 Redo Log 写入磁盘(fsync最高(崩溃不丢数据)最低
        0每秒将 Redo Log 写入磁盘(后台线程刷盘)可能丢失最多1秒数据最高
        2每次事务提交时将 Redo Log 写入操作系统缓存,由系统决定何时刷到磁盘可能丢失操作系统崩溃中等
      • 默认值
        innodb_flush_log_at_trx_commit=1(即策略1:每次提交刷盘)。
        这是 MySQL 的默认配置,确保事务提交后数据持久化到磁盘,符合 ACID 的持久性要求。

  • 示例:事务提交后,即使断电,重启后通过 Redo Log 重放恢复数据。

ACID 是事务的基石,通过 Undo Log(原子性)、约束(一致性)、锁与 MVCC(隔离性)、Redo Log(持久性)实现。

参考:腾讯元宝

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值