事务的ACID特性【通俗易懂】

一、前言

  • 事务的ACID特性是数据库管理系统(DBMS)中用于确保事务正确性可靠性的四个核心属性。

二、ACID分解

1.原子性(Atomicity)

  • 定义:事务是一个不可分割的最小工作单元,事务中的所有操作要么全部成功提交,要么全部失败回滚,不存在中间状态。
  • 示例:银行转账中,账户A扣款和账户B入账必须同时成功或同时失败。
  • 实现原理
    • 通过Undo Log(回滚日志)实现。
    • 若事务失败,系统利用Undo Log逆向执行已提交的操作,恢复到事务前的状态。

2.一致性(Consistency)

  • 定义:事务执行前后,数据库必须从一个合法的状态转换到另一个合法的状态,所有数据约束(如唯一性、外键、业务逻辑)必须保持正确。
  • 示例:转账前后,账户A和B的总金额应保持不变。
  • 实现原理
    • 由原子性、隔离性、持久性共同保障。
    • 数据库通过预定义规则(如触发器、约束)和应用层逻辑共同维护。

3.隔离性(Isolation)

  • 定义:并发执行的多个事务之间互不干扰,每个事务感知到的数据状态如同串行执行。
  • 常见问题
    • 脏读:读取到其他事务未提交的数据。
    • 不可重复读:同一事务内两次读取同一数据结果不同。
    • 幻读:同一事务内两次查询结果集行数不同。
  • 隔离级别
    • 读未提交(Read Uncommitted):最低隔离,不解决任何问题。
    • 读已提交(Read Committed):解决脏读。
    • 可重复读(Repeatable Read):解决脏读和不可重复读(InnoDB默认级别,通过MVCC避免幻读)。
    • 串行化(Serializable):最高隔离,完全串行执行。
  • 实现原理
    • 锁机制:行锁、表锁、意向锁等控制并发访问。
    • MVCC(多版本并发控制):通过隐藏列、版本链、ReadView实现非阻塞读,保证读写不冲突。
  • 详细的解释可以看我的上一篇文章:【一文搞懂】什么是并发中的脏读、幻读、不可重复读问题及解决方案?

4.持久性(Durability)

  • 定义:事务提交后,对数据的修改是永久性的,即使系统崩溃也不会丢失。
  • 实现原理
    • Redo Log(重做日志):事务提交时先写日志(顺序IO),再异步刷盘。崩溃恢复时通过Redo Log重放操作。
    • WAL(Write-Ahead Logging):日志先行策略,确保数据持久性。

三、ACID的关系

  • 一致性是最终目标,原子性、隔离性、持久性均为实现一致性的手段。
  • 原子性和持久性通过Undo LogRedo Log实现。
  • 隔离性通过MVCC实现。

四、实际应用

  • 银行系统:转账操作需严格满足ACID,避免金额错误或丢失。
  • 电商订单:下单、扣库存、支付等操作需事务保障数据一致性。
  • 通过ACID特性,数据库系统能够在高并发复杂操作中保持数据的正确性和可靠性。

你可能感兴趣的:(数据库,MySQL,事务,ACID特性,并发)