首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >深入理解事务-ACID 特性与 MySQL/InnoDB 的实现原理

深入理解事务-ACID 特性与 MySQL/InnoDB 的实现原理

原创
作者头像
一键难忘
发布2025-08-26 13:15:05
发布2025-08-26 13:15:05
3320
举报
文章被收录于专栏:技术汇总专栏技术汇总专栏

深入理解事务-ACID 特性与 MySQL/InnoDB 的实现原理

一、事务的概念

事务(Transaction) 是数据库管理系统(DBMS)中的一个 逻辑操作单位,它由 一组操作组成,要么全部执行成功,要么全部不执行

简单来说,事务保证数据库从一个一致性状态转换到另一个一致性状态,不会出现部分执行导致的数据错误。

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

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

在这里插入图片描述
在这里插入图片描述
代码语言:bash
复制
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读取的数据就是“脏数据”。
  1. 不可重复读(Non-repeatable Read)
  • 同一事务在不同时间两次读取同一条记录,结果不同。
  • 示例:事务A第一次读取用户余额为100元,事务B修改并提交余额为200元,事务A第二次读取得到200元。
  1. 幻读(Phantom Read)
  • 同一事务中执行相同查询,但查询结果集中的记录数发生变化。
  • 示例:事务A查询表中年龄大于30的用户数为10,事务B插入一条新用户年龄为35并提交,事务A再次查询,结果为11。

3.2 隔离级别

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

隔离级别

允许出现的问题

特点说明

读未提交(Read Uncommitted)

脏读、不可重复读、幻读

并发性能最高,但数据一致性最低

读已提交(Read Committed)

不可重复读、幻读

每次读取都是已提交数据,防脏读

可重复读(Repeatable Read)

幻读

防止同一事务中重复读取出现不同结果

串行化(Serializable)

最严格的隔离级别,事务顺序执行,性能最差

3.3 隔离性实现方式

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

  1. 锁机制(Lock)
  • 事务执行时,对数据加锁(共享锁/排他锁),其他事务必须等待锁释放才能访问。
  • 优点:简单直观
  • 缺点:可能导致死锁
  1. 多版本并发控制(MVCC)
  • 数据库保存数据的多个版本,读取事务只访问自己可见的版本,不阻塞写事务。
  • 常用在 MySQL InnoDB 引擎中,实现可重复读隔离级别。

四、持久性(Durability)

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

4.1 实现机制

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

  1. 日志文件(Redo Log / Write-Ahead Logging)
  • 事务修改数据前先写入日志,保证即使系统故障也可通过日志恢复数据。
  1. 持久化存储
  • 提交的事务最终会写入磁盘存储,确保数据在数据库重启后仍然存在。
  1. 同步刷盘策略
  • 可以选择同步或异步刷盘。同步刷盘可以保证最高可靠性,异步刷盘可提升性能但有一定丢失风险。

4.2 示例

银行转账事务:

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

五、事务应用场景

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

  1. 金融支付
  • 转账、支付、退款等操作必须保证原子性和一致性。
  1. 库存管理
  • 商品库存扣减与订单生成需要原子操作,避免超卖。
  1. 订单处理
  • 多表操作(订单表、库存表、支付表)需要事务保证各表状态同步。
  1. 用户信息修改
  • 用户资料涉及多个字段或表的更新,需要保证修改要么全部生效,要么全部回滚。

总结

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

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

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

在这里插入图片描述
在这里插入图片描述

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 深入理解事务-ACID 特性与 MySQL/InnoDB 的实现原理
  • 一、事务的概念
  • 二、事务的四大特性(ACID)
    • 1. 原子性(Atomicity)
    • 2. 一致性(Consistency)
    • 3. 隔离性(Isolation)
    • 4. 持久性(Durability)
  • 三、隔离性(Isolation)
    • 3.1 隔离性问题类型
    • 3.2 隔离级别
    • 3.3 隔离性实现方式
  • 四、持久性(Durability)
    • 4.1 实现机制
    • 4.2 示例
  • 五、事务应用场景
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档