每日一个解决问题:事务无法回滚是什么原因?

news/2024/11/27 4:54:51/

今天在码代码时发现事务不回滚了,学过MySQL 事务小伙伴们都懂,通过 begin 开启事务,通过 commit 提交事务或者通过 rollback 回滚事务。

正常来说,当我们开启一个事务之后,需要 commit 或者 rollback 来结束一个事务的,但是有时候,一些操作会自动帮我们提交事务,如果大家不了解隐式事务的话,那么在具体使用事务的事务可能就会遭遇一些莫名其妙的问题。

1、DDL 操作

首先一点就是 DDL 操作会隐式提交事务,这个我在之前的文章中其实有说过,现在来简单总结一下:

所有的 DDL 语句都会导致事务隐式提交,换句话说,当你在执行 DDL 语句前,事务就已经提交了。这就意味着带有 DDL 语句的事务将来没有办法 rollback。

我举一个简单的例子,大家一起来看下:

我们来一起看下我这里的测试逻辑:

  1. 首先查询总记录数有四条。
  2. 开启一个事务。
  3. 执行一条删除语句。
  4. alter 表,新增一个字段。
  5. 回滚。
  6. 再次查询数据。

到第六步的时候,我们发现查询到的数据只剩三条了,说明第五步的回滚并没有生效。原因就在于执行 alter 之前,事务已经被隐式提交了。

所以小伙伴们在日常开发中,最好不要在事务中混有 DDL 语句,DDL 语句和 DML 语句分开写。

对于上面的案例,如果大家去掉第四步的 alter,那么回滚是可以回滚成功的,这个小伙伴们自己来测试,我就不演示了。

当然 DDL 操作可不仅仅是 alter,其他的如 CREATE、DROP 等操作也会导致事务隐式提交,这里我就不一一举例了,小伙伴们可以自行尝试。

2、DCL 操作

DDL 和 DML 大家应该经常接触到,但是 DCL 可能有小伙伴不清楚,DCL 其实就是 Data Control Language,中文译作数据控制语言,我们日常授权或者回收数据库上的权限所使用的 GRANT、REVOKE 等,就算是 DCL 操作。

我举个简单例子:

可以看到,跟第一小节的测试步骤一样,只不过第四步换成一个 GRANT 语句,那么最终的事务回滚也会失效,原因就在于事务已经提交了。

当然,除了 GRANT 和 REVOKE 之外,其他的创建、更新或者删除用户的操作也会导致事务隐式提交。主要有:

  • CREATE USER…
  • DROP USER…
  • ALTER USER…
  • SET PASSWORD…

3、新事务开启

一个事务还没提交,结果你又开启了一个新的事务,那么此时前一个事务也会隐式提交。看个例子:

这个好理解,不多说。

4、各种锁操作

给表上锁、解锁也会导致事务隐式提交。如下:

上锁的 SQL 如 lock tables table_name read|write,会导致事务隐式提交,解锁的 SQL 如 unlock tables 也会导致事务被隐式提交。

除了表锁,一些全局锁如 FTWRL 也会导致事务的隐式提交,如下:

5、从机的操作

我们在从机上执行的一些操作如 start slavestop slavereset slave 以及 change master to 等语句也会隐式提交事务。

6、其他表操作

其他的一下操作如刷新权限(flush privileges)、优化表(optimize table)、修复表(repair table)等操作,也会导致事务的隐式提交。

我在网上看有人说 LOAD DATA 会隐式提交事务,本人亲测貌似并不会,如下图:

LOAD DATA 似乎并没有导致事务隐式提交,欢迎大家提出不同见解一起探讨。

7. 最佳实践

那就会有小伙伴问,那么多隐式提交,我怎么可能记得住呀?其实不用背,你只要记着事务里只写增删改查(INSERT/DELETE/UPDATE/SELECT),就不会错啦!


http://www.ppmy.cn/news/23955.html

相关文章

基于matlab使用机器学习和深度学习进行雷达目标分类

一、前言此示例展示了如何使用机器学习和深度学习方法对雷达回波进行分类。机器学习方法使用小波散射特征提取与支持向量机相结合。此外,还说明了两种深度学习方法:使用SqueezeNet的迁移学习和长短期记忆(LSTM)递归神经网络。请注…

【刷题篇】链表(上)

前言🌈前段时间我们学习了单向链表和双向链表,本期将带来3道与链表相关的OJ题来巩固对链表的理解。话不多说,让我们进入今天的题目吧!🚀本期的题目有:反转单链表、链表的中间结点、合并两个有序链表反转单链…

【nodejs】nodejs入门核心知识(命令行使用、内置模块、node 模块化开发)

💻 nodejs入门核心知识(命令行使用、内置模块、node 模块化开发) 🏠专栏:JavaScript 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享…

Python 高级编程之IO模型与协程(四)

文章目录一、概述二、IO模型1)IO 模型准备1、用户空间和内核空间2、进程切换3、进程的阻塞4、文件描述符fd5、缓存 I/O2)IO 模型详解1、同步阻塞IO(Blocking IO)2、同步非阻塞IO(Non-blocking IO)3、IO多路…

leetcode刷题 | 关于二叉树的题型总结2

leetcode刷题 | 关于二叉树的题型总结2 文章目录leetcode刷题 | 关于二叉树的题型总结2题目链接求根节点到叶节点数字之和路径总和 III二叉树中的最大路径和题目链接 129. 求根节点到叶节点数字之和 - 力扣(LeetCode) 437. 路径总和 III - 力扣&#x…

Android 逆向工具大整理,碉堡了

文章目录jadx打开 gui 界面把安装包打开双击变量名和方法名可以高亮所有出现的地方**强大的搜索功能****搜索资源****查看 APK 签名****查看 APK dex 数,方法数****查看资源,配置清单****展开包名**查找方式引用反混淆导出 Gradle 工程导出反编译资源cla…

云原生系列之使用 prometheus监控MySQL实战

文章目录前言一. 实验环境二. 安装MySQL5.72.1 配置yum源2.2 安装MySQL之前的环境检查2.3 开始使用yum安装2.4 启动MySQL并测试三. 安装MySQL_exporter3.1 MySQL_exporter的介绍3.2 mysql_exporter的安装3.3 设置MySQL账户,用于数据收集3.4 启动mysql_exporter3.5 配…

python selenium浏览器复用技术

使用selenium 做web自动化的时候,经常会遇到这样一种需求,是否可以在已经打开的浏览器基础上继续运行自动化脚本? 这样前面的验证码登录可以手工点过去,后面页面使用脚本继续执行,这样可以解决很大的一个痛点。 命令行…