在实际开发中,如果不对 CURD 操作加以控制,可能会引发数据不一致的问题。例如在并发场景下,单纯的增删改查可能导致线程冲突。
为了解决这类问题,我们需要引入事务的概念。事务本质上是一组逻辑上相关的 DML 语句,它们要么全部成功,要么全部失败。比如毕业离校时,教务系统需要删除学生的基本信息、成绩记录以及论坛发帖等,这些分散的操作必须作为一个整体执行,才能保证数据的完整性。
什么是事务
一个完整的事务不仅仅是 SQL 的集合,它必须满足四个核心属性,简称 ACID:
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。如果执行过程中出错,会被回滚到事务开始前的状态,就像从未执行过一样。
- 一致性(Consistency):事务前后,数据库的完整性没有被破坏。写入的数据必须符合预设规则,包括精确度、关联性及后续工作的自发性。
- 隔离性(Isolation):防止多个并发事务交叉执行导致数据不一致。隔离级别包括读未提交、读提交、可重复读和串行化。
- 持久性(Durability):事务处理结束后,对数据的修改是永久的,即便系统故障也不会丢失。
为什么会出现事务
事务的设计初衷是为了简化应用层的编程模型。当应用程序访问数据库时,通过事务机制,开发者无需手动处理网络异常、服务器宕机或并发冲突等底层细节。事务将复杂的并发控制封装起来,让业务逻辑更专注于'提交'或'回滚'的判断。
事务的版本支持
在 MySQL 中,只有使用 InnoDB 存储引擎的数据库或表才支持事务,MyISAM 引擎则不支持。
可以通过以下命令查看当前支持的引擎:
show engines; -- 表格显示
或者以行格式显示:
show engines \G;
确保你的表使用的是 engine=InnoDB。
事务提交方式
事务的提交方式主要分为自动提交和手动提交两种。
查看与设置
默认情况下,MySQL 是开启自动提交的。我们可以通过变量查看当前状态:
show variables like 'autocommit';
若要改变模式,可以使用 SET 命令:
set autocommit = 0; -- 禁止自动提交
set autocommit = 1; -- 开启自动提交
实战演示
为了便于理解,我们创建一个测试表并模拟几种常见场景。首先创建表结构:
create table if not exists account(
id int primary key,
name () ,
balance (,)
) engineInnoDB charsetutf8;


