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

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

情况2.执行下列操作,

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

情况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 语句MySQL 数据库操作过程中,为了确保数据的一致性和完整性,在遇到错误时可以利用事务机制来回滚已执行的操作。当查询因某些原因未能成功完成时会触发自动回滚;而对于手动控制的情况,则需依据预先设定好的条件来决定何时调用 `ROLLBACK` 命令[^1]。 下面是一个简单的例子展示如何实现这一点: ```sql START TRANSACTION; -- 尝试插入新记录到表 t_user 中 INSERT INTO t_user (name, age) VALUES ('Alice', 25); -- 如果上述命令失败,则整个事务将会被撤销; -- 否则继续下一个操作... UPDATE another_table SET column='value' WHERE condition=true; IF some_condition THEN ROLLBACK; -- 发生特定情况下的显式回滚 ELSE COMMIT; END IF; ``` 在这个案例里,如果任意一条 DML(Data Manipulation Language)指令出现问题,那么之前所有的更改都将失效并恢复至最初状态。对于更复杂的场景下可能还需要创建存储过程以便更好地管理异常处理流程,并且可以在其中加入更多的业务逻辑判断以确定是否应该提交还是回滚当前正在进行中的事务[^3]。 #### 使用带有错误检测的存储过程来进行回滚 ```sql DELIMITER $$ CREATE PROCEDURE process_with_rollback() BEGIN DECLARE exit handler FOR SQLEXCEPTION BEGIN ROLLBACK; END; START TRANSACTION; INSERT INTO t_user(name,age)VALUES('Bob',30); UPDATE other_table SET field=value WHERE criteria=met; COMMIT; END$$ DELIMITER ; ``` 此段代码定义了一个名为 `process_with_rollback()` 的存储过程,它会在遇到任何SQLEXCEPTION类型的异常时立即执行回滚操作,从而保证数据库内部的数据一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值