MySQL InnoDB 引擎下,事务相关分为:自动提交模式、事务隔离级别、事务访问模式(只读 / 读写)、保存点、隐式事务几个概念。
1. 自动提交模式 autocommit
控制 SQL 是否自动提交事务,默认开启 autocommit=ON
autocommit=1(ON):每条 DML 语句执行完自动提交,每条语句就是一个独立事务。
-- 查看
show variables like 'autocommit';
-- 关闭自动提交
set autocommit = 0;
autocommit 关闭后,必须手动
commit;/rollback;,否则变更只在当前会话。
手动开启事务另外两种写法:
START TRANSACTION; -- 开启事务,会临时忽略autocommit设置
BEGIN; -- 等价 start transaction
-- 执行DML
COMMIT; -- 提交
ROLLBACK; -- 回滚
2. 四大事务隔离级别(核心)
解决脏读、不可重复读、幻读问题,InnoDB 默认 REPEATABLE‑READ(可重复读),通过 MVCC 实现。
设置隔离级别:
-- 会话级别
set session transaction isolation level read committed;
-- 全局级别
set global transaction isolation level repeatable read;
3. 事务访问模式(读写 / 只读模式)
MySQL 支持显式指定事务是读写还是只读,只读事务优化内部性能。
-- 读写事务(默认)
START TRANSACTION READ WRITE;
-- 只读事务,只能select,不能DML,InnoDB做性能优化
START TRANSACTION READ ONLY;
COMMIT;
注意:
READ ONLY事务中执行增删改会报错。
4. 保存点 SAVEPOINT(部分回滚)
事务内部设置回滚点,不用全部回滚,只回滚到某个保存点。
START TRANSACTION;
insert into t values(1);
SAVEPOINT sp1;
insert into t values(2);
ROLLBACK TO sp1; -- 回滚到sp1,value=2被撤销,value=1保留
COMMIT;
RELEASE SAVEPOINT sp1; -- 删除保存点
5. 隐式事务
DDL 语句 (
create/drop/alter) 会隐式提交当前打开的事务,DDL 本身无法回滚。部分语句会触发隐式提交:
LOCK TABLES、UNLOCK TABLES。
补充:事务的提交模式(completion_type)
completion_type 控制 commit 行为:
0:默认,commit 直接提交;1:COMMIT等价COMMIT AND CHAIN,提交后立刻开启新事务;2:COMMIT等价COMMIT AND RELEASE,提交后断开会话。
show variables like 'completion_type';
总结
日常开发最常接触:
autocommit 自动提交开关;
4 种隔离级别;
start transaction / begin / commit / rollback;
savepoint 部分回滚;
read only 只读事务。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢