当前位置: 首页 > web >正文

工作日记总结-transaction is aborted, commands ignored until end of transaction block

目录

  • 问题描述
  • 问题原因
  • 总结

问题描述

公司一项目,之前员工在sql映射文件的一个标签内写了多条增删改语句,并通过begin、end包装起来,想的是手动开启事务;

    <insert id="insertUser">begin;insert into users (id,name,pass) values ('1','qw','pass');insert into users (id,name,pass) values ('1','zdf','pass');insert into users (id,name,pass) values ('2','qfg','pass');end;</insert>

最近程序抛出异常,现象是查表数据时抛出异常

transaction is aborted, commands ignored until end of transaction block

问题原因

原因就在于没用的begin/end,手动开启显式事务,如果执行不出错,看不出问题,但是一旦sql中间执行报错,就会出现事务卡死的状态,没有机制可以rollback,释放当前事务;
如果java程序中没有捕获异常并处理,当前这个数据库连接就处于一个“脏”状态;
下一次再从数据库连接池中获取这个连接,执行sql时,就会抛出这个异常,意思是当前事务锁死,无法执行sql,除非rollback,把它回滚掉;

总结

  1. 在一个sql标签内,最好不要写begin、end,对于每个标签内的多条sql,mybatis/plus执行之前,会通过当前的sqlSession(封装的connection对象),设置当前数据库会话为自动提交事务,然后会将标签内的所有sql拼接成一个字符串发送给数据库
  2. 即使这个字符串包含了多条sql,数据库也会将它视为一个原子性的操作,数据库会开启一个隐式事务,都执行成功之后会自动提交,执行异常会自动回滚
  3. 因此,一个sql标签内的sql语句本身原子性的操作,无需通过begin/end手动开启事务,不仅无用,还会造成事务卡死,脏连接的问题;
http://www.xdnf.cn/news/13369.html

相关文章:

  • [软件测试]:什么是自动化测试?selenium+webdriver-manager的安装,实现你的第一个脚本
  • Kotlin基础语法二
  • 大数据学习(136)-数据埋点
  • 玄机 日志分析-Tomcat日志分析 WriteUp
  • G-Star公益行 | 公益组织入门开源技术,六月北京点燃改变的星火
  • 【MySQL数据库】InnoDB存储引擎:事务原理redolog、undolog与版本控制MVCC
  • QuecPython 文件系统操作
  • 多光谱图像技术在苗期作物与杂草识别中的研究进展
  • C语言学习20250610
  • Dynadot邮箱工具指南(六):将域名邮箱添加至网易邮箱大师
  • Leetcode 3576. Transform Array to All Equal Elements
  • 新能源知识库(34)什么是单一制和两部制
  • 【SAP MM SD FICO】销售视图和会计视图
  • C++ 8.1内联函数之宏定义
  • Metasploitable: 1靶场渗透
  • 在postgresql中,group by时取第一个值
  • 网络编程(Modbus进阶)
  • Manus 框架与 COKE 框架解析及完整 Demo
  • Unreal从入门到精通之使用 CheatManager 自定义控制台命令
  • 操作系统的一些名词
  • 期末考试复习总结-第一章《HarmonyOS介绍》
  • ​计算机网络原理超详解说​
  • 2025-03-14-Google检索技巧
  • 华为云Flexus+DeepSeek征文 | 基于ModelArts Studio、DeepSeek大模型和Dify搭建网站智能客服助手
  • 深度学习——简介
  • Ubuntu下挂载NTFS格式磁盘
  • 访问服务器项目,服务器可以ping通,但是端口访问不到
  • C++ mutex 锁的使用
  • JavaScript BOM 详细介绍
  • 重温经典算法——二分查找