MySQL中有事务无法回滚的语句?

目录

0.从修改表结构语句开始

1.DDL(Data Definition Language) 数据定义语言

2.DCL(Data Control Language) 数据控制语言

 3.在该事务还没提交时开启新事务

4.锁操作

5.行政声明语句

6.主从复制的从机操作

7.如何避免出现隐式提交导致的错误


0.从修改表结构语句开始

试想在这个场景,客户A开启一个事务,修改表1第一个字段的值,而之后客户B此时在删除表1结构的第一个字段,那这时候就会出问题了。

元数据锁(MDL)可以解决这个问题。该锁是系统自动控制的,无需显示使用的,在访问一张表的时候会自动加上的。这个特性是在MySQL5.5中引入的。

  • 当对一张表进行增删改查的时候,加MDL读锁(共享锁)
  • 当对表结构进行变更操作的时候,加MDL写锁(排他)

MDL锁主要作用是维护表元数据的数据一致性,是为了避免DML语句和DDL冲突,保证读写的正确性。

即是上面所说的场景,客户B在修改表1结构时候就会被阻塞,直到客户A提交了事务才删除成功。

那反过来想一种场景:客户B先开启事务,删除表1结构的一个字段,没有提交;之后客户A查看表1数据。

那按照之前的分析,客户A的查看应该是会被阻塞的,可事实是没有被阻塞。左边的事务还没提交,右边的会话就可以看到左边事务的结果了。

 所以可以想到该修改表结构语句的事务是默认自动提交的,隐式帮我们提交了事务。

有些语句隐式结束当前会话中任何活动的事务,就好像您在执行该语句之前完成了COMMIT一样,这样使用rollback就无效了。

这里要注意的是:是在执行修改表结构语句之前,就隐式提交了事务,不是执行了修改表结构语句后才提交。

接下来就讲讲有哪些语句不能回滚的。

1.DDL(Data Definition Language) 数据定义语言

前面的修改表结构就是DDL语句。

备注:若不了解DDL,可以查看该文章MySQL的SQL语句

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

看例子:

在第5步查看结果的时候,发现表和插入的数据都有了,说明回滚没有生效。原因是在第3步,执行DDL语句之前事务就被隐式提交。

DDL语句会进行隐式提交,是不能rollback的,所以大家在日常开发中一定要注意。

建议:最好不要在事务中混有 DDL 语句,DDL 语句和 DML 语句分开写。

为什么DDL语句会隐式提交?
因为DDL是数据定义语言,在我们的数据库中承担着创建,删除和修改的重要的职责。一旦发生问题,带来的后果很可能是不可估量的。于是在每执行完一次后就进行提交,可以保证流畅性,数据不会发生阻塞,同时也会提高数据库的整体性能。

2.DCL(Data Control Language) 数据控制语言

这个语句主要是管理用户,权限所使用的 GRANT、REVOKE 等。

看例子:

步骤5查看数据,显示数据已被修改,说明回滚无效,即在执行DCL语句前事务已隐式提交了。

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

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

 3.在该事务还没提交时开启新事务

一个事务还没提交时,跟着你又开启了一个新的事务,那么此时前一个事务也会隐式提交。

看例子:

4.锁操作

给表上锁、解锁会导致事务隐式提交,全局锁也会导致事务隐式提交。

5.行政声明语句

 ANALYZE TABLE(分析表),CHECK TABLE(检查表是否有错误),FLUSH PRIVILEGES(刷新权限),OPTIMIZE TABLE,REPAIR TALBE(修复表),RESET(用于重置服务器的某些内部状态)。

上述操作也会导致事务的隐式提交。

6.主从复制的从机操作

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

7.如何避免出现隐式提交导致的错误

在事务过程中,就只对表数据进行增删改查

需要对表结构操作的就要等退出事务后再操作。

主要参考来源:MySQL 8.0 参考手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/511506.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下thinkphp使用php7.4.5版本链接oracle数据库

我用的php运行环境是PHPCUSTOM,感谢大佬Lccee的耐心指导。 大佬的博客https://blog.csdn.net/Lccee?typeblog 首先查看自己的oracle版本 查询语句: SELECT * FROM v$version;根据自己的版本下载对应的oracle客户端,及得版本运行环境与自己的环境位数要…

GIN与Echo:选择正确Go框架的指南

您是否在Go中构建Web应用?选择正确的框架至关重要!GIN和Echo是两个热门选择,每个都有其优势和特点。本指南将详细介绍每个框架的特性、速度、社区热度以及它们各自擅长的项目类型。最后,您将能够为您的下一个Web项目选择完美的框架…

使用GRU进行天气变化的时间序列预测

本文基于最适合入门的100个深度学习项目的学习记录,同时在Google clolab上面是实现,文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战,主要是因为天气系统的高度动态性和非线性特征。以下是几个主…

RabbitMQ分享

RabbitMQ遵循AMQP协议,自身采用Erlang RabbitMQ工作模式 生产者发消息,启动多个消费者实例来消费消息,每个消费者仅消费部分信息,可达到负载均衡的效果。 RabbitMQ三种常用交换机类型: 交换机主要起调度分发作用。 …

动手学深度学习—循环神经网络RNN详解

循环神经网络 循环神经网络的步骤: 处理数据 将数据按照批量大小和时间步数进行处理,最后得到迭代器,即每一个迭代的大小是批量大小时间步数,迭代次数根据整个数据的大小决定,最后得出处理的数据(参照第三…

java面试(jvm)

JVM内存模型 细分Eden: java类加载过程?双亲委派机制?一个对象从加载到JVM,再到被GC清除过程? JAVA类加载器:AppClassLoader - ExtClassLoader - BootStrapClassLoader。每种类加载器都有他自己的加载目录…

Go语言中的时间控制:定时器技术详细指南

Go语言中的时间控制:定时器技术详细指南 引言定时器基础创建和使用time.Timer使用time.Ticker实现周期性任务定时器的内部机制小结 使用time.Timer实现简单的定时任务创建和启动定时器停止和重置定时器定时器的实际应用小结 利用time.Ticker处理重复的定时任务创建和…

ubuntu debian apt deb debootstrap根文件系统制作 利用国内源加速 清华源

参考项目 https://github.com/Kron4ek/Wine-Builds/blob/master/create_ubuntu_bootstraps.sh 制作一个最小的deb 根文件系统 sudo apt install debootstrap debootstrap --arch amd64 jammy ~/tmp/ubuntu-jammy-bootstrap https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ 命…

HCIA-HarmonyOS设备开发V2.0证书

目录 一、不墨迹,上证书二、考试总结三、习题四、知识点五、坚持就有收获 HCIA-HarmonyOS Device Developer V2.0 开发者能力认证考试已通过。 一、不墨迹,上证书 一个多月的努力,验证了自己的学习成果,也认识到自己有待提升之处…

Flutter中的Provider状态管理工具有哪些优势

在Flutter应用开发中,状态管理是一个至关重要的方面。而Provider作为一种简单、灵活且高效的状态管理工具,在众多Flutter开发者中备受青睐。本文将深入探讨Provider在Flutter中的优势,帮助读者更好地理解其价值和应用场景。 简单易用 Provi…

JVM 面试题

1、什么情况下会发生栈内存溢出。 栈内存溢出通常发生在以下几种情况中: 函数递归调用过深: 当函数递归调用自身且没有合适的退出条件时,每次递归调用都会在栈上分配一个新的栈帧来存储局部变量、返回地址等信息。如果递归层次过多&#xff…

制作耳机壳的UV树脂和塑料材质相比优势有哪些?

制作耳机壳的UV树脂相比塑料材质有以下优势: 高强度与耐磨性:UV树脂具有高强度和耐磨性,能够更好地保护耳机内部零件,延长耳机使用寿命。相比之下,塑料材质可能较易磨损或刮伤。耐高温:UV树脂具有较好的耐…