mysql 事务中如果有sql语句出错,会导致自动回滚吗?

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.执行下列操作, 

mysql 事务中如果有sql语句出错,会导致自动回滚吗?_第1张图片

会发现新开窗口 去查询name表时,整个事务都会回滚掉。

情况2.执行下列操作,

mysql 事务中如果有sql语句出错,会导致自动回滚吗?_第2张图片

会发现第一条语句成功了 。 

情况3.再执行下列操作

mysql 事务中如果有sql语句出错,会导致自动回滚吗?_第3张图片

此时并没有commit , 但可以查到第一条执行成功的数据, 第二条语法错误的语句会被回滚。

上述是因为在手动提交模式下, MySQL事务管理中未显式提交时的回滚机制,核心逻辑基于事务的原子性、日志系统和自动提交模式。

一、事务的原子性保障

  1. 原子性原理
    事务被视为不可分割的最小操作单元,所有操作要么全部成功提交,要么全部失败回滚。

  2. 若事务未执行COMMIT,MySQL默认认为事务未完成,需撤销所有中间操作,确保数据库恢复到事务开始前的状态。

  3. 自动提交模式的影响

    • 默认自动提交‌:每条独立SQL语句作为一个事务自动提交。
    • 手动提交模式‌:通过SET autocommit=0关闭自动提交,此时需显式执行COMMITROLLBACK。若未提交且会话终止,MySQL自动触发回滚。

二、事务日志与回滚机制

  1. Undo日志的作用
    MySQL通过Undo日志记录事务执行前的数据状态。若未提交:

    • 所有已执行的SQL操作暂存于内存或临时空间,未写入数据文件。
    • 回滚时,根据Undo日志逆向执行操作,恢复数据到事务开始前的状态。
  2. 隐式回滚触发条件
    若发生以下情况,MySQL自动回滚未提交的事务:

    • 客户端连接异常中断(如崩溃或超时)。
    • 执行过程中出现错误(如语法错误、约束冲突等)。
    • 显式调用ROLLBACK命令

关键注意事项

  1. 隔离级别的影响
    不同隔离级别(如读已提交、可重复读)会影响事务间的可见性,但不改变未提交事务必然回滚的核心逻辑。
  2. 隐式提交的例外
    执行DDL语句(如CREATE TABLE)或开启新事务(BEGIN)会隐式提交当前未提交的事务。

 简单来说就是:

1、begin;  .....; commit;    方式下 , 触发隐式自动回滚的情况:语法错误、会话断连、客户端崩溃等, 没有手动commit 都会自动回滚未提交的事务。

2、手动rollback 未提交的事务, 也会触发回滚

3、但是执行主键冲突。 死锁等错误,不会回滚, 就算最后手动commit也不行

你可能感兴趣的:(mysql,sql,数据库)