数据库事务原理与实践:原子性、一致性、隔离性、持久性深度剖析

举报
柠檬味拥抱 发表于 2025/08/26 13:14:08 2025/08/26
【摘要】 事务(Transaction) 是数据库管理系统(DBMS)中的一个 逻辑操作单位,它由 一组操作组成,要么全部执行成功,要么全部不执行。 简单来说,事务保证数据库从一个一致性状态转换到另一个一致性状态,不会出现部分执行导致的数据错误。

事务管理与ACID特性分析:保证数据一致性的核心机制

一、事务的概念

事务(Transaction) 是数据库管理系统(DBMS)中的一个 逻辑操作单位,它由 一组操作组成,要么全部执行成功,要么全部不执行
简单来说,事务保证数据库从一个一致性状态转换到另一个一致性状态,不会出现部分执行导致的数据错误。

常见例子:银行转账操作。

  1. A账户减去100元
  2. B账户增加100元
    如果中间发生故障,事务可以保证 A账户不会扣款而B账户未到账,或操作全部完成。

在这里插入图片描述

mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb;  # 创建数据表
Query OK, 0 rows affected (0.04 sec)
 
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
 
mysql> begin;  # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
 
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
 
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
 
mysql>  select * from runoob_transaction_test;
+------+
| id   |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql> begin;    # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql>  insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
 
mysql> rollback;   # 回滚
Query OK, 0 rows affected (0.00 sec)
 
mysql>   select * from runoob_transaction_test;   # 因为回滚所以数据没有插入
+------+
| id   |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql>

二、事务的四大特性(ACID)

事务的可靠性由 ACID 四大特性保障:

1. 原子性(Atomicity)

  • 定义:事务中的操作要么 全部执行成功,要么 全部不执行
  • 作用:保证操作的完整性,不会出现部分执行导致数据异常。
  • 实现机制:数据库通过 回滚(Rollback) 实现原子性。

示例:转账事务中,如果扣款成功但存款失败,事务会回滚,扣款也不生效。


2. 一致性(Consistency)

  • 定义:事务执行前后,数据库必须保持 一致状态
  • 作用:保证数据满足数据库的约束规则,如主键约束、外键约束、触发器等。
  • 实现机制:数据库事务在执行成功后,会自动确保数据符合所有约束条件。

示例:银行账户总余额在转账前后应保持不变,总金额保持一致。


3. 隔离性(Isolation)

  • 定义:并发执行的事务之间互不干扰,每个事务的中间状态对其他事务不可见。

  • 作用:防止并发操作造成的数据不一致问题。

  • 隔离级别(SQL标准):

    1. 读未提交(Read Uncommitted):可能读取到其他事务未提交的数据 → 脏读
    2. 读已提交(Read Committed):只能读取已提交数据 → 避免脏读
    3. 可重复读(Repeatable Read):同一事务中重复读取数据结果一致 → 避免不可重复读
    4. 串行化(Serializable):事务完全串行执行 → 避免幻读

4. 持久性(Durability)

  • 定义:事务一旦提交,对数据库的修改就是 永久性的,不会因为系统故障而丢失。
  • 作用:保证数据可靠性和安全性。
  • 实现机制:数据库将修改写入 日志文件(Redo Log) 或持久化存储。

示例:转账成功后,即使数据库宕机,账户余额修改也不会丢失。

三、隔离性(Isolation)

隔离性是指 并发执行的事务之间互不干扰,每个事务的中间状态对其他事务不可见。隔离性可以有效避免并发操作导致的数据不一致问题。

3.1 隔离性问题类型

在实际数据库中,隔离性不够会产生以下三类常见问题:

  1. 脏读(Dirty Read)

    • 一个事务读取了另一个事务未提交的数据。
    • 示例:事务A修改了某条记录但未提交,事务B读取了这个修改,如果事务A回滚,则事务B读取的数据就是“脏数据”。
  2. 不可重复读(Non-repeatable Read)

    • 同一事务在不同时间两次读取同一条记录,结果不同。
    • 示例:事务A第一次读取用户余额为100元,事务B修改并提交余额为200元,事务A第二次读取得到200元。
  3. 幻读(Phantom Read)

    • 同一事务中执行相同查询,但查询结果集中的记录数发生变化。
    • 示例:事务A查询表中年龄大于30的用户数为10,事务B插入一条新用户年龄为35并提交,事务A再次查询,结果为11。

3.2 隔离级别

SQL 标准定义了四种隔离级别,分别解决不同程度的隔离问题:

隔离级别 允许出现的问题 特点说明
读未提交(Read Uncommitted) 脏读、不可重复读、幻读 并发性能最高,但数据一致性最低
读已提交(Read Committed) 不可重复读、幻读 每次读取都是已提交数据,防脏读
可重复读(Repeatable Read) 幻读 防止同一事务中重复读取出现不同结果
串行化(Serializable) 最严格的隔离级别,事务顺序执行,性能最差

3.3 隔离性实现方式

数据库通过 锁机制多版本控制(MVCC) 来实现隔离性:

  1. 锁机制(Lock)

    • 事务执行时,对数据加锁(共享锁/排他锁),其他事务必须等待锁释放才能访问。
    • 优点:简单直观
    • 缺点:可能导致死锁
  2. 多版本并发控制(MVCC)

    • 数据库保存数据的多个版本,读取事务只访问自己可见的版本,不阻塞写事务。
    • 常用在 MySQL InnoDB 引擎中,实现可重复读隔离级别。

四、持久性(Durability)

持久性指 事务一旦提交,其对数据库的修改就是永久性的,不会因为系统崩溃或断电而丢失。

4.1 实现机制

数据库通常通过以下方式保证持久性:

  1. 日志文件(Redo Log / Write-Ahead Logging)

    • 事务修改数据前先写入日志,保证即使系统故障也可通过日志恢复数据。
  2. 持久化存储

    • 提交的事务最终会写入磁盘存储,确保数据在数据库重启后仍然存在。
  3. 同步刷盘策略

    • 可以选择同步或异步刷盘。同步刷盘可以保证最高可靠性,异步刷盘可提升性能但有一定丢失风险。

4.2 示例

银行转账事务:

  • A账户减款100元
  • B账户加款100元
  • 提交事务后,即使数据库服务器宕机,系统重启后账户余额仍然正确。

五、事务应用场景

事务在实际系统中主要用于保证 数据一致性与完整性,常见应用场景包括:

  1. 金融支付

    • 转账、支付、退款等操作必须保证原子性和一致性。
  2. 库存管理

    • 商品库存扣减与订单生成需要原子操作,避免超卖。
  3. 订单处理

    • 多表操作(订单表、库存表、支付表)需要事务保证各表状态同步。
  4. 用户信息修改

    • 用户资料涉及多个字段或表的更新,需要保证修改要么全部生效,要么全部回滚。

总结

事务(Transaction)是数据库中保证操作 原子性、一致性、隔离性、持久性(ACID) 的基本单元,通过四大特性保障数据在并发和故障情况下的可靠性:

  1. 原子性(Atomicity):事务操作要么全部成功,要么全部回滚,避免部分操作导致的数据异常。
  2. 一致性(Consistency):事务执行前后数据库始终保持约束规则和数据完整性,保证业务逻辑正确。
  3. 隔离性(Isolation):并发事务互不干扰,通过锁机制或多版本控制(MVCC)防止脏读、不可重复读和幻读。
  4. 持久性(Durability):事务一旦提交,修改永久保存,即使系统崩溃也能通过日志或持久化存储恢复数据。

事务广泛应用于金融支付、库存管理、订单处理及多表操作等场景,是保障数据库可靠性和数据一致性的核心机制。
在这里插入图片描述

一、事务的概念

事务(Transaction) 是数据库管理系统(DBMS)中的一个 逻辑操作单位,它由 一组操作组成,要么全部执行成功,要么全部不执行
简单来说,事务保证数据库从一个一致性状态转换到另一个一致性状态,不会出现部分执行导致的数据错误。

常见例子:银行转账操作。

  1. A账户减去100元
  2. B账户增加100元
    如果中间发生故障,事务可以保证 A账户不会扣款而B账户未到账,或操作全部完成。

在这里插入图片描述

mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb;  # 创建数据表
Query OK, 0 rows affected (0.04 sec)
 
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
 
mysql> begin;  # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
 
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
 
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
 
mysql>  select * from runoob_transaction_test;
+------+
| id   |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql> begin;    # 开始事务
Query OK, 0 rows affected (0.00 sec)
 
mysql>  insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
 
mysql> rollback;   # 回滚
Query OK, 0 rows affected (0.00 sec)
 
mysql>   select * from runoob_transaction_test;   # 因为回滚所以数据没有插入
+------+
| id   |
+------+
| 5    |
| 6    |
+------+
2 rows in set (0.01 sec)
 
mysql>

二、事务的四大特性(ACID)

事务的可靠性由 ACID 四大特性保障:

1. 原子性(Atomicity)

  • 定义:事务中的操作要么 全部执行成功,要么 全部不执行
  • 作用:保证操作的完整性,不会出现部分执行导致数据异常。
  • 实现机制:数据库通过 回滚(Rollback) 实现原子性。

示例:转账事务中,如果扣款成功但存款失败,事务会回滚,扣款也不生效。


2. 一致性(Consistency)

  • 定义:事务执行前后,数据库必须保持 一致状态
  • 作用:保证数据满足数据库的约束规则,如主键约束、外键约束、触发器等。
  • 实现机制:数据库事务在执行成功后,会自动确保数据符合所有约束条件。

示例:银行账户总余额在转账前后应保持不变,总金额保持一致。


3. 隔离性(Isolation)

  • 定义:并发执行的事务之间互不干扰,每个事务的中间状态对其他事务不可见。

  • 作用:防止并发操作造成的数据不一致问题。

  • 隔离级别(SQL标准):

    1. 读未提交(Read Uncommitted):可能读取到其他事务未提交的数据 → 脏读
    2. 读已提交(Read Committed):只能读取已提交数据 → 避免脏读
    3. 可重复读(Repeatable Read):同一事务中重复读取数据结果一致 → 避免不可重复读
    4. 串行化(Serializable):事务完全串行执行 → 避免幻读

4. 持久性(Durability)

  • 定义:事务一旦提交,对数据库的修改就是 永久性的,不会因为系统故障而丢失。
  • 作用:保证数据可靠性和安全性。
  • 实现机制:数据库将修改写入 日志文件(Redo Log) 或持久化存储。

示例:转账成功后,即使数据库宕机,账户余额修改也不会丢失。

三、隔离性(Isolation)

隔离性是指 并发执行的事务之间互不干扰,每个事务的中间状态对其他事务不可见。隔离性可以有效避免并发操作导致的数据不一致问题。

3.1 隔离性问题类型

在实际数据库中,隔离性不够会产生以下三类常见问题:

  1. 脏读(Dirty Read)

    • 一个事务读取了另一个事务未提交的数据。
    • 示例:事务A修改了某条记录但未提交,事务B读取了这个修改,如果事务A回滚,则事务B读取的数据就是“脏数据”。
  2. 不可重复读(Non-repeatable Read)

    • 同一事务在不同时间两次读取同一条记录,结果不同。
    • 示例:事务A第一次读取用户余额为100元,事务B修改并提交余额为200元,事务A第二次读取得到200元。
  3. 幻读(Phantom Read)

    • 同一事务中执行相同查询,但查询结果集中的记录数发生变化。
    • 示例:事务A查询表中年龄大于30的用户数为10,事务B插入一条新用户年龄为35并提交,事务A再次查询,结果为11。

3.2 隔离级别

SQL 标准定义了四种隔离级别,分别解决不同程度的隔离问题:

隔离级别 允许出现的问题 特点说明
读未提交(Read Uncommitted) 脏读、不可重复读、幻读 并发性能最高,但数据一致性最低
读已提交(Read Committed) 不可重复读、幻读 每次读取都是已提交数据,防脏读
可重复读(Repeatable Read) 幻读 防止同一事务中重复读取出现不同结果
串行化(Serializable) 最严格的隔离级别,事务顺序执行,性能最差

3.3 隔离性实现方式

数据库通过 锁机制多版本控制(MVCC) 来实现隔离性:

  1. 锁机制(Lock)

    • 事务执行时,对数据加锁(共享锁/排他锁),其他事务必须等待锁释放才能访问。
    • 优点:简单直观
    • 缺点:可能导致死锁
  2. 多版本并发控制(MVCC)

    • 数据库保存数据的多个版本,读取事务只访问自己可见的版本,不阻塞写事务。
    • 常用在 MySQL InnoDB 引擎中,实现可重复读隔离级别。

四、持久性(Durability)

持久性指 事务一旦提交,其对数据库的修改就是永久性的,不会因为系统崩溃或断电而丢失。

4.1 实现机制

数据库通常通过以下方式保证持久性:

  1. 日志文件(Redo Log / Write-Ahead Logging)

    • 事务修改数据前先写入日志,保证即使系统故障也可通过日志恢复数据。
  2. 持久化存储

    • 提交的事务最终会写入磁盘存储,确保数据在数据库重启后仍然存在。
  3. 同步刷盘策略

    • 可以选择同步或异步刷盘。同步刷盘可以保证最高可靠性,异步刷盘可提升性能但有一定丢失风险。

4.2 示例

银行转账事务:

  • A账户减款100元
  • B账户加款100元
  • 提交事务后,即使数据库服务器宕机,系统重启后账户余额仍然正确。

五、事务应用场景

事务在实际系统中主要用于保证 数据一致性与完整性,常见应用场景包括:

  1. 金融支付

    • 转账、支付、退款等操作必须保证原子性和一致性。
  2. 库存管理

    • 商品库存扣减与订单生成需要原子操作,避免超卖。
  3. 订单处理

    • 多表操作(订单表、库存表、支付表)需要事务保证各表状态同步。
  4. 用户信息修改

    • 用户资料涉及多个字段或表的更新,需要保证修改要么全部生效,要么全部回滚。

总结

事务(Transaction)是数据库中保证操作 原子性、一致性、隔离性、持久性(ACID) 的基本单元,通过四大特性保障数据在并发和故障情况下的可靠性:

  1. 原子性(Atomicity):事务操作要么全部成功,要么全部回滚,避免部分操作导致的数据异常。
  2. 一致性(Consistency):事务执行前后数据库始终保持约束规则和数据完整性,保证业务逻辑正确。
  3. 隔离性(Isolation):并发事务互不干扰,通过锁机制或多版本控制(MVCC)防止脏读、不可重复读和幻读。
  4. 持久性(Durability):事务一旦提交,修改永久保存,即使系统崩溃也能通过日志或持久化存储恢复数据。

事务广泛应用于金融支付、库存管理、订单处理及多表操作等场景,是保障数据库可靠性和数据一致性的核心机制。
在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。