事务的四大特性(ACID)详解

事务的四大特性(ACID)详解

在数据库管理系统(如 MySQL)中,事务(Transaction) 是指一组要么全部执行、要么全部不执行的数据库操作,通常用于确保数据的完整性和一致性。事务有四大核心特性,即 ACID ,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

作用:

事务的 ACID 四大特性是数据库系统用来确保数据完整性、正确性和并发一致性的核心机制。通过日志、事务隔离级别、数据库约束等手段,数据库可以有效解决数据一致性问题和并发问题,为数据的可靠性保驾护航。

ACID 四大特性

特性 英文名称 定义 常见问题及解决方法
原子性 Atomicity 事务中的所有操作要么全部成功,要么全部失败并回滚。 通过事务日志(Undo Log)和回滚机制实现
一致性 Consistency 事务执行前后,数据库保持一致性,满足完整性约束。 通过数据库约束、触发器、日志来维护一致性
隔离性 Isolation 多个事务并发时,相互隔离,防止脏读、不可重复读等问题。 通过事务隔离级别(如可重复读、可序列化等)解决并发问题
持久性 Durability 事务一旦提交,修改将永久保存,即使系统故障也不会丢失。 通过事务日志(Redo Log)、备份机制实现

1. 原子性(Atomicity)

定义:

原子性是指事务中的所有操作被视为一个整体,要么全部执行成功,要么全部失败并回滚(rollback),不能只执行部分操作。

如果事务在执行过程中发生错误或出现故障,数据库系统会将其恢复到事务开始之前的状态,保证数据不会被部分更新。

举例:

银行转账操作:从用户A的账户转出100元并转入用户B的账户。如果只有扣款成功,而转账失败,就会导致数据不一致。而原子性确保要么两步都成功,要么两步都不执行,保证事务的完整性。

实现方式:

通过 回滚机制(Rollback)日志(Undo Log) 来实现。


2. 一致性(Consistency)

定义:

一致性是指事务执行前后,数据库必须处于一致的状态。

也就是说,事务执行后,数据要满足数据库的完整性约束(如主键约束、外键约束、唯一性约束等)。

举例:

假设有一个规则要求:银行所有账户的总余额应该保持不变。如果在用户A和用户B之间转账后,数据库中总余额仍然等于事务执行前的总余额,就表示事务保持了一致性。

实现方式:

通过 数据库约束(如外键、触发器)、事务日志和回滚机制 来维护一致性。


3. 隔离性(Isolation)

定义:

隔离性是指当多个事务并发执行时,一个事务的执行不应受到其他事务的影响,各事务之间相互隔离,防止并发问题(如脏读、不可重复读、幻读)。

并发问题及其含义:

  • 脏读(Dirty Read): 一个事务读取了另一个事务未提交的数据。
  • 不可重复读(Non-repeatable Read): 在同一事务中,两次读取的同一数据结果不一致,因其他事务修改了该数据。
  • 幻读(Phantom Read): 一个事务读取了数据集合,另一个事务在集合中插入了新数据,导致前一个事务在再次读取时"看到"新的数据,仿佛出现了幻影。

解决方法(隔离级别):

SQL 标准定义了四种事务隔离级别,从低到高依次为:

  1. 读未提交(Read Uncommitted): 允许脏读、不可重复读、幻读。
  2. 读已提交(Read Committed): 不允许脏读,但可能出现不可重复读和幻读。
  3. 可重复读(Repeatable Read): 禁止脏读和不可重复读,但可能出现幻读(MySQL 默认级别)。
  4. 可序列化(Serializable): 提供最高隔离级别,完全防止上述问题,但降低并发性能。

4. 持久性(Durability)

定义:

持久性是指事务一旦提交,所做的修改将永久保存在数据库中,即使系统发生故障(如断电、宕机),数据也不会丢失。

举例:

当用户完成一笔银行转账并提交事务后,即使系统宕机,转账结果也会永久保存到数据库中。

实现方式:

通过 事务日志(Redo Log)数据库写盘机制备份机制 来保证事务的持久性。即使发生意外故障,数据库可以通过日志来恢复提交的事务。


事务执行过程(一般步骤):

  1. 开启事务

    sql 复制代码
    START TRANSACTION;  
  2. 执行事务操作 :如插入、更新或删除操作。

    sql 复制代码
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;  
    UPDATE accounts SET balance = balance + 100 WHERE id = 2;  
  3. 提交事务(提交数据并永久保存):

    sql 复制代码
    COMMIT;  
  4. 回滚事务(若发生错误,撤销事务中的所有操作):

    sql 复制代码
    ROLLBACK;  
相关推荐
此生只爱蛋22 分钟前
【Linux】正/反向代理
linux·运维·服务器
qq_54702617928 分钟前
Linux 基础
linux·运维·arm开发
zfj32134 分钟前
sshd除了远程shell外还有哪些功能
linux·ssh·sftp·shell
山沐与山38 分钟前
【数据库】PostgreSQL架构与索引深度剖析
数据库·postgresql·架构
废春啊41 分钟前
前端工程化
运维·服务器·前端
我只会发热44 分钟前
Ubuntu 20.04.6 根目录扩容(图文详解)
linux·运维·ubuntu
爱潜水的小L1 小时前
自学嵌入式day34,ipc进程间通信
linux·运维·服务器
保持低旋律节奏1 小时前
linux——进程状态
android·linux·php
不穿格子的程序员1 小时前
Redis篇6——Redis深度剖析:从单机到集群,Redis高可用进化史
数据库·redis·集群·主从·高可用·哨兵
zhuzewennamoamtf1 小时前
Linux I2C设备驱动
linux·运维·服务器