MySQL 事务核心:ACID 特性、提交回滚与隔离级别详解
什么是事务?
事务是由一组 DML 语句组成的逻辑单元,这些语句在逻辑上存在强相关性。这一组 SQL 要么全部成功,要么全部失败,是一个不可分割的整体。MySQL 提供机制来保证这种效果,主要用于处理操作量大、复杂度高的数据场景。
一个 MySQL 数据库同一时刻可能运行着大量请求,每条事务至少包含一条 SQL。如果多个事务同时访问同样的表数据且缺乏保护,必然会出现问题。特别是当事务由多条 SQL 构成时,若执行中途出错或主动取消,已执行的步骤该如何处理?
因此,一个完整的事务绝非简单的 SQL 集合,必须满足以下四个属性(ACID):
- 原子性 (Atomicity):事务中的所有操作要么全部完成,要么全部不完成。若执行过程中发生错误,会被回滚到事务开始前的状态,就像从未执行过一样。
- 一致性 (Consistency):事务开始前和结束后,数据库的完整性未被破坏。写入的数据必须符合所有预设规则,包括精确度、关联性及后续数据库可自发完成预定工作。
- 隔离性 (Isolation):数据库允许多个并发事务同时读写修改数据。隔离性防止并发执行导致数据不一致。事务隔离分为不同级别,包括读未提交、读提交、可重复读和串行化。
- 持久性 (Durability):事务处理后,对数据的修改是永久的,即便系统故障也不会丢失。
只要做到原子性、隔离性和持久性,技术上就能保证数据的一致性。
为什么需要事务?
事务被设计出来的本质是为了简化应用层的编程模型。当应用程序访问数据库时,通过事务屏蔽了各种潜在的错误和并发问题。开发者只需关注业务逻辑,无需考虑网络异常、服务器宕机或并发冲突等底层细节——要么提交,要么回滚。
因此,事务本质上是为应用层服务的,而非数据库系统天生自带的固有属性。
事务的版本支持
在 MySQL 中,只有使用 InnoDB 存储引擎的数据库或表才支持事务,MyISAM 不支持。
可以通过以下命令查看当前支持的引擎:
mysql> show engines;
输出结果中,InnoDB 显示 Transactions: YES,而 MyISAM 显示 Transactions: NO。这意味着生产环境必须确保关键业务表使用 InnoDB 引擎。
事务提交方式
事务的提交方式主要有两种:自动提交和手动提交。
查看与设置
默认情况下,MySQL 开启自动提交模式。可以通过以下命令查看:
show variables like 'autocommit';
若要改变自动提交模式,可以使用 SET 语句:
set autocommit=0; -- 禁止自动提交
set autocommit=1; -- 开启自动提交
注意:一旦输入 BEGIN 或 START TRANSACTION,当前会话的自动提交行为会被临时覆盖,事务必须显式提交才能生效,这与全局的 autocommit 设置无关。
事务常见操作
为了演示事务操作,我们准备一个简单的账户表。注意修正字段名拼写错误(原名为 blance,现统一为 balance)。


