一文弄懂事务的四个特性

事务的四个特性(ACID)

一文弄懂事务的四个特性_第1张图片

在数据库管理系统中,事务(Transaction)是一组操作的集合,这些操作要么全部成功执行,要么全部失败回滚。为了保证事务的正确性和可靠性,数据库系统引入了事务的四个特性,即 ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些特性确保了数据库在并发操作和系统故障的情况下仍能保持数据的完整性和一致性。

1. 原子性(Atomicity)

定义

原子性是指事务中的所有操作要么全部成功执行,要么全部失败回滚。事务是一个不可分割的工作单元,不允许部分操作成功而部分操作失败。

详细说明
  • 全部成功: 如果事务中的所有操作都成功执行,则事务提交(Commit),数据被永久保存。
  • 全部失败: 如果事务中的任何一个操作失败,则事务回滚(Rollback),所有操作都被撤销,数据库恢复到事务开始之前的状态。
  • 实现机制: 数据库通过日志(Log)和回滚段(Rollback Segment)来实现原子性。日志记录了事务的所有操作,回滚段用于存储事务执行前的数据状态,以便在需要时进行回滚。
示例

假设有一个转账事务,包含两个操作:

  1. 从账户A扣除100元。
  2. 向账户B增加100元。

如果第一个操作成功,但第二个操作失败,原子性要求整个事务回滚,账户A的100元不会被扣除。

2. 一致性(Consistency)

一文弄懂事务的四个特性_第2张图片

定义

一致性是指事务执行前后,数据库必须保持一致性状态。即事务的执行不能破坏数据库的完整性约束(如主键、外键、唯一性约束等)。

详细说明
  • 数据完整性: 事务执行后,数据库必须满足所有的完整性约束条件。
  • 业务规则: 事务必须符合业务逻辑规则,例如转账事务中,账户余额不能为负数。
  • 实现机制: 一致性由数据库的完整性约束和应用程序的业务逻辑共同保证。数据库系统会在事务提交前检查所有约束条件,如果违反约束,则事务回滚。
示例

在转账事务中,如果账户A的余额不足100元,事务将无法执行,数据库会回滚事务,确保账户余额不会出现负数。

3. 隔离性(Isolation)

定义

隔离性是指多个事务并发执行时,每个事务的操作与其他事务的操作相互隔离,互不干扰。隔离性确保了并发事务的执行不会导致数据不一致。

详细说明
  • 并发控制: 数据库通过锁机制(Locking)或多版本并发控制(MVCC)来实现隔离性。
  • 隔离级别: 数据库提供了不同的隔离级别(如读未提交、读已提交、可重复读、串行化),以平衡并发性能和数据一致性。
    • 读未提交(Read Uncommitted): 最低隔离级别,允许读取未提交的数据,可能导致脏读。
    • 读已提交(Read Committed): 只能读取已提交的数据,避免脏读,但可能出现不可重复读。
    • 可重复读(Repeatable Read): 保证在同一事务中多次读取同一数据的结果一致,避免不可重复读,但可能出现幻读。
    • 串行化(Serializable): 最高隔离级别,完全隔离事务,避免脏读、不可重复读和幻读,但并发性能最低。
示例

假设有两个事务同时执行:

  • 事务A:读取账户A的余额。
  • 事务B:修改账户A的余额。

如果事务B在事务A读取数据后修改了数据,事务A可能会读取到不一致的数据。通过设置合适的隔离级别,可以避免这种情况。

4. 持久性(Durability)

定义

持久性是指事务一旦提交,其对数据库的修改就是永久性的,即使系统发生故障(如断电、崩溃),数据也不会丢失。

详细说明
  • 数据持久化: 数据库通过将事务的修改写入持久化存储(如磁盘)来实现持久性。
  • 日志机制: 数据库使用日志(如重做日志 Redo Log)来记录事务的修改操作。在系统故障恢复时,可以通过日志重新执行已提交的事务,确保数据的持久性。
  • 检查点机制: 数据库定期创建检查点(Checkpoint),将内存中的数据刷新到磁盘,减少故障恢复的时间。
示例

在转账事务中,一旦事务提交,账户A和账户B的余额修改将被永久保存,即使系统在提交后立即崩溃,数据也不会丢失。

ACID特性的重要性

ACID特性是数据库事务的核心,它们共同确保了数据库的可靠性和一致性:

  • 原子性 保证了事务的完整性,避免了部分操作成功导致的逻辑错误。
  • 一致性 确保了数据库始终处于合法状态,符合业务规则和约束条件。
  • 隔离性 解决了并发事务之间的冲突,防止数据不一致。
  • 持久性 确保了数据的永久保存,即使在系统故障的情况下也能恢复数据。

流程图

以下是ACID特性的流程图:

ACID特性
原子性
一致性
隔离性
持久性
事务的所有操作要么全部成功要么全部失败
事务执行前后数据库保持一致性状态
多个事务并发执行时操作相互隔离
事务提交后修改永久保存

你可能感兴趣的:(读研的日常拾光,数据库,性能优化,mysql,后端,golang,面试,c++)