MySQL 事务:从基础概念到隔离性理论与实践
什么是事务?
事务是由一组 DML 语句组成的逻辑单元,这些语句在逻辑上存在相关性。这一组 DML 语句要么全部成功,要么全部失败,是一个整体。MySQL 提供机制保证这种效果,主要用于处理操作量大、复杂度高的数据。
一个 MySQL 数据库同一时刻可能有大量请求被包装成事务发起处理。如果多条 SQL 访问同样的表数据且不加保护,必然会出现问题。特别是事务由多条 SQL 构成,执行到一半出错或不想继续时,已执行的怎么办?
因此,完整的事务必须满足四个属性(ACID):
- 原子性(Atomicity):所有操作要么全部完成,要么全部不完成。发生错误会被回滚到事务开始前的状态,就像从未执行过一样。
- 一致性(Consistency):事务前后数据库完整性未被破坏。写入资料必须符合预设规则,包含精确度、串联性及后续工作自发性完成。
- 隔离性(Isolation):防止多个事务并发执行时交叉导致数据不一致。分为读未提交、读提交、可重复读和串行化。
- 持久性(Durability):事务处理后对数据的修改是永久的,即便系统故障也不会丢失。
只要做到原子性、隔离性和持久性,技术上就能保证数据的一致性。
为什么需要事务?
事务本质是为了简化应用层的编程模型。当应用程序访问数据库时,开发者不需要考虑网络异常、服务器宕机或并发冲突等潜在错误。使用事务时,只需关注提交或回滚,无需手动处理底层复杂性。事务是为应用层服务的,而非数据库系统天生伴随的。
版本支持
只有使用 InnoDB 存储引擎的数据库或表才支持事务,MyISAM 不支持。
查看数据库引擎:
show engines;
输出中可以看到 InnoDB 的 Transactions: YES,而 MyISAM 为 NO。
事务提交方式
常见的提交方式有两种:自动提交和手动提交。
查看当前模式:
show variables like 'autocommit';
使用 set 命令切换:
-- 禁止自动提交
set autocommit=0;
-- 开启自动提交
set autocommit=1;
常见操作演示
为了便于演示,我们将默认隔离级别设置为读未提交(实际生产不建议)。
准备测试环境
创建账户表:
create table if not exists account(
id int primary key,
name varchar() ,
balance (,)
) ENGINEInnoDB CHARSETUTF8;


