CREATE TABLE `name` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT
'ID'
,
`name` varchar(32) DEFAULT
''
COMMENT
'名称'
,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
情况1.执行下列操作,
会发现新开窗口 去查询name表时,整个事务都会回滚掉。
情况2.执行下列操作,
会发现第一条语句成功了 。
情况3.再执行下列操作
此时并没有commit , 但可以查到第一条执行成功的数据, 第二条语法错误的语句会被回滚。
上述是因为在手动提交模式下, MySQL事务管理中未显式提交时的回滚机制,核心逻辑基于事务的原子性、日志系统和自动提交模式。
一、事务的原子性保障
原子性原理
事务被视为不可分割的最小操作单元,所有操作要么全部成功提交,要么全部失败回滚。若事务未执行
COMMIT
,MySQL默认认为事务未完成,需撤销所有中间操作,确保数据库恢复到事务开始前的状态。自动提交模式的影响
- 默认自动提交:每条独立SQL语句作为一个事务自动提交。
- 手动提交模式:通过
SET autocommit=0
关闭自动提交,此时需显式执行COMMIT
或ROLLBACK
。若未提交且会话终止,MySQL自动触发回滚。
二、事务日志与回滚机制
Undo日志的作用
MySQL通过Undo日志记录事务执行前的数据状态。若未提交:
- 所有已执行的SQL操作暂存于内存或临时空间,未写入数据文件。
- 回滚时,根据Undo日志逆向执行操作,恢复数据到事务开始前的状态。
隐式回滚触发条件
若发生以下情况,MySQL自动回滚未提交的事务:
- 客户端连接异常中断(如崩溃或超时)。
- 执行过程中出现错误(如语法错误、约束冲突等)。
- 显式调用
ROLLBACK
命令关键注意事项
- 隔离级别的影响
不同隔离级别(如读已提交、可重复读)会影响事务间的可见性,但不改变未提交事务必然回滚的核心逻辑。- 隐式提交的例外
执行DDL语句(如CREATE TABLE
)或开启新事务(BEGIN
)会隐式提交当前未提交的事务。
简单来说就是:
1、begin; .....; commit; 方式下 , 触发隐式自动回滚的情况:语法错误、会话断连、客户端崩溃等, 没有手动commit 都会自动回滚未提交的事务。
2、手动rollback 未提交的事务, 也会触发回滚
3、但是执行主键冲突。 死锁等错误,不会回滚, 就算最后手动commit也不行