mysql的存储引擎决定了表的很多特性,其中事务支持能力是核心差异之一,自动提交和事务管理是操作数据时绕不开的两个机制,直接影响数据操作的可靠性和执行逻辑。不同存储引擎对这两个机制的支持程度不同,需要开发者根据实际场景选择合适的配置和使用方式。

常见存储引擎的事务支持差异
mysql中常用的存储引擎里,innodb是默认且最常用的支持事务的引擎,而myisam、memory等引擎则不支持事务。我们可以通过SHOW_ENGINE_STATUS或者查询information_schema.engines表来查看引擎的事务支持情况,以下是常见引擎的特性对比:
| 存储引擎 | 支持事务 | 支持自动提交配置 | 默认自动提交状态 |
|---|---|---|---|
| innodb | 是 | 是 | 开启 |
| myisam | 否 | 否 | 无 |
| memory | 否 | 否 | 无 |
自动提交机制详解
自动提交是mysql的一个会话级参数,控制每条单独的写操作语句是否自动开启并结束一个事务。当自动提交开启时,每执行一条insert、update、delete语句,mysql都会自动将其包装成一个事务并立即提交,不需要手动执行commit命令。当自动提交关闭时,这些写操作语句会处于一个未提交的事务中,需要手动执行commit才会生效,或者执行rollback回滚操作。
查看自动提交状态
可以通过以下命令查看当前会话的自动提交状态:
-- 查看自动提交参数,1表示开启,0表示关闭 SHOW VARIABLES LIKE 'autocommit';
修改自动提交状态
自动提交可以全局修改也可以会话级修改,会话级修改只对当前连接生效,全局修改对新建立的连接生效,已存在的连接不受影响:
-- 会话级关闭自动提交 SET autocommit = 0; -- 会话级开启自动提交 SET autocommit = 1; -- 全局关闭自动提交,需要管理员权限 SET GLOBAL autocommit = 0;
事务管理基础操作
只有支持事务的存储引擎(如innodb)才能使用事务管理相关操作,事务管理主要包含开启事务、提交事务、回滚事务三个核心操作:
开启事务
有两种方式可以开启一个事务,第一种是关闭自动提交后,第一条写操作语句会自动开启事务;第二种是显式执行开启事务的命令:
-- 显式开启事务,会隐式提交之前未提交的事务 START TRANSACTION; -- 另一种开启事务的写法 BEGIN;
提交与回滚事务
当事务中的操作执行完成后,可以选择提交让修改生效,或者回滚撤销所有修改:
-- 创建测试表,使用innodb引擎
CREATE TABLE test_transaction (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
) ENGINE=innodb;
-- 显式开启事务
START TRANSACTION;
-- 插入两条数据
INSERT INTO test_transaction (name) VALUES ('张三');
INSERT INTO test_transaction (name) VALUES ('李四');
-- 提交事务,两条数据都会写入表中
COMMIT;
-- 再次开启事务
START TRANSACTION;
INSERT INTO test_transaction (name) VALUES ('王五');
-- 回滚事务,王五这条数据不会被写入
ROLLBACK;
自动提交与事务的搭配使用场景
日常开发中可以根据场景灵活调整自动提交状态:
- 如果是简单的单条写操作,不需要保证多语句的原子性,保持自动提交开启即可,操作更简便。
- 如果需要执行多条写操作,要求要么全部成功要么全部失败(比如转账场景,扣款和加款必须同时生效),就需要关闭自动提交,或者显式开启事务,执行完所有操作后手动提交,出现异常时回滚。
- 注意如果在一个会话中手动开启了事务,即使自动提交是开启状态,也需要手动提交或者回滚事务,直到事务结束才会恢复自动提交的逻辑。
注意事项
1. 修改全局自动提交参数后,已经存在的连接不会受影响,只有新建立的连接会使用新的配置。
2. 执行DDL语句(如CREATE TABLE、ALTER TABLE)时,无论自动提交是否开启,都会隐式提交当前未提交的事务。
3. 如果存储引擎不支持事务,即使执行了START TRANSACTION命令,也不会生效,写操作会直接生效无法回滚。
合理设置自动提交状态,结合正确的事务操作,可以有效保证mysql中数据操作的一致性和可靠性,避免数据异常问题。