MySQL 事务详解:原理、特性与隔离级别实战
什么是事务
事务(Transaction)是由一组逻辑上相关的 DML 语句组成的整体。这一组操作要么全部成功,要么全部失败,不会停留在中间状态。MySQL 通过事务机制保证数据的一致性,特别是在多客户端并发执行时,防止脏读、不可重复读和幻读等问题。
简单来说,事务是一种具有业务场景的业务处理单元。例如转账业务,涉及两条 SQL:一条扣款,一条入账。这两条语句必须同时成功或同时失败,这就是原子性的体现。理解事务不应仅局限于程序员视角,它更是用户级业务逻辑的保障。
一个完整的事务需要满足以下四个属性(ACID):
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。若执行过程中出错,系统会回滚到事务开始前的状态,就像从未执行过一样。
- 一致性(Consistency):事务前后数据库的完整性未被破坏。写入的数据必须符合预设规则,包括精确度、关联性及后续工作的自发性。
- 隔离性(Isolation):数据库允许多个并发事务同时读写修改数据,但隔离性可防止交叉执行导致的数据不一致。隔离级别分为读未提交、读提交、可重复读和串行化。
- 持久性(Durability):事务一旦提交,对数据的修改就是永久的,即使系统故障也不会丢失。
为什么需要事务
事务的设计初衷是为了简化应用层的编程模型。当应用程序访问数据库时,我们不需要手动处理网络异常、服务器宕机或并发冲突等底层细节。事务本质上是为应用层服务的,而非数据库天生就有的概念。
并发问题示例
如果不加控制地进行 CURD 操作,很容易出现数据不一致的情况。以买票为例:
- 买票过程必须是原子的(原子性)。
- 多个买票请求不能互相影响(隔离性)。
- 买完票后状态应永久有效(持久性)。
- 买前和买后的状态必须是确定的(一致性)。
存储引擎支持
并非所有存储引擎都支持事务。常见的 InnoDB 引擎支持事务,而 MyISAM 则不支持。在生产环境中,涉及资金或关键数据变更时,务必使用 InnoDB。
事务的控制与操作
自动提交与手动提交
MySQL 默认开启自动提交模式。可以通过以下方式查看和修改:
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;


