问一个spring事务的问题

「已注销」 2018-09-19 02:25:26
异常现象如下:

2018-09-18 16:46:04:748 [http-nio-9090-exec-4] [INFO] - org.springframework.beans.factory.xml.XmlBeanDefinitionReader(loadBeanDefinitions:316) - Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
2018-09-18 16:46:04:787 [http-nio-9090-exec-4] [INFO] - org.springframework.jdbc.support.SQLErrorCodesFactory(<init>:126) - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
2018-09-18 16:46:04:802 [http-nio-9090-exec-4] [INFO] - com.sun.proxy.$Proxy166(afterThrowing:25) - **************************************************************
2018-09-18 16:46:04:802 [http-nio-9090-exec-4] [INFO] - com.sun.proxy.$Proxy166(afterThrowing:26) - 代理对象: com.sun.proxy.$Proxy166
2018-09-18 16:46:04:803 [http-nio-9090-exec-4] [INFO] - com.sun.proxy.$Proxy166(afterThrowing:27) - 发生异常方法: getById
2018-09-18 16:46:04:803 [http-nio-9090-exec-4] [INFO] - com.sun.proxy.$Proxy166(afterThrowing:29) - 方法参数[0]: 4795
2018-09-18 16:46:04:803 [http-nio-9090-exec-4] [INFO] - com.sun.proxy.$Proxy166(afterThrowing:29) - 方法参数[1]: true
2018-09-18 16:46:04:804 [http-nio-9090-exec-4] [INFO] - com.sun.proxy.$Proxy166(afterThrowing:31) - 异常名称: org.springframework.dao.CannotAcquireLockException
2018-09-18 16:46:04:804 [http-nio-9090-exec-4] [INFO] - com.sun.proxy.$Proxy166(afterThrowing:32) - 异常信息:
### Error querying database. Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

====================

首先,异常的原因我已经知道,因为另外一个事务里把数据锁住了,但是事务一直没提交,所以select for update 的锁没释放,导致等待超时了。

但是,另外一个事务为什么没提交的原因没弄明白。


时间顺序大概是这个样子,事务1已经处理完了,到事务的最后一步了,可是卡在这里了。一直等到五分钟之后才成功。
事务2,事务3都是再去找select for update 数据的时候,悲观锁没释放导致查不到数据超时了,然后超时之后就抛出异常了。

我的问题是事务1已经处理完了,整个方法的最后一步都执行完了可就是迟迟没有走到事务外层方法,所以也就一直没有commit成功。但是这个节点应该已经没有阻碍它提交的东西了,为什么一直提交不上去呢?
...全文
185 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-09-20
  • 打赏
  • 举报
回复
DBA说是数据库磁盘空间不够


但是事务过了五分钟又提上去了,我猜测应该是数据库的缓存不够了,被其他线程占用了,然后过了一段时间其他线程释放了,所以就提上去了。
「已注销」 2018-09-19
  • 打赏
  • 举报
回复
怀疑1:spring或者mysql在做事务提交的时候对于相同资源的CRUD有排他性,也就是相同资源的操作是单例的。(这种可能性不大)
怀疑2:程序中出现逻辑死锁。比如 有两个并发事务,事务1:lock A-->事务2:lock B--> 事务1 lock B(不能lock,等待)-->事务2:lockA(不能lock,等待),这样两个事务会互相等待。一直到事务超时。(但检查代码没有发现这种)
怀疑3:问题中提到的事务1可能因为某种原因被直接挂起了,(也许资源不够,数据库暂时失去链接等),然后因为事务1一直占用资源不释放,就导致其他访问该资源的线程直接没法执行了。

怀疑4:与select for update无关。 是访问其他资源出的问题
icarusliu81 2018-09-19
  • 打赏
  • 举报
回复
程序设计估计存在问题。最好将代码放出来看看。现有信息判断不了
My_Pass_Word 2018-09-19
  • 打赏
  • 举报
回复
你这种问题应该偶尔出现一次把,这种不能重现的情况我一般会回复客户说:"把你们的操作步骤导致出现的问题说一下,如果不能重现我就回复重现不了,以后慢慢再找",拖字诀,影响不大就行
「已注销」 2018-09-19
  • 打赏
  • 举报
回复
引用 2 楼 My_Pass_Word 的回复:
有时候不是程序的原因,百度一下你用的是哪个数据库是否锁表了,把锁的表释放了,在简单一点就是重启数据库,然后你再走一下程序看一下。
一般造成数据库锁表是程序引起的,不过一般问题不大


没有锁表,因为最终事务1提交成功了。所以2,3报错了,1 成功了。最终结果是正确的。

我观察是用户执行了1,结果卡住了,然后又刷新执行了2,又卡住,又刷新执行了3。
都是对同一条数据的操作。

但是这个事务比较大,涉及到十条左右的数据更新/插入吧。
「已注销」 2018-09-19
  • 打赏
  • 举报
回复
引用 1 楼 icarusliu 的回复:
事务1在做什么事情?
事务1 2 3 是执行的同一个方法,并发执行了。不过这个时间线看日志的话事务1执行完了才走到2 3
My_Pass_Word 2018-09-19
  • 打赏
  • 举报
回复
有时候不是程序的原因,百度一下你用的是哪个数据库是否锁表了,把锁的表释放了,在简单一点就是重启数据库,然后你再走一下程序看一下。 一般造成数据库锁表是程序引起的,不过一般问题不大
icarusliu81 2018-09-19
  • 打赏
  • 举报
回复
事务1在做什么事情?
第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识。   第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。   第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架的三个最重要的框架级接口进行了剖析,并对Bean的生命周期进行讲解。   第4章:讲解如何在Spring配置文件中使用Spring 3.0的Schema格式配置Bean的内容,并对各个配置项的意义进行了深入的说明。   第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。   第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的内核中,分析它的底层结构和具体实现。   第7章:对如何使用基于AspectJ配置AOP的知识进行了深入的分析,这包括使用XML Schema配置文件、使用注解进行配置等内容。   第8章:介绍了Spring所提供的DAO封装层,这包括Spring DAO的异常体系、数据访模板等内容。   第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。   第10章:对实际应用中Spring事务管理各种疑难进行透彻的剖析,让读者对Spring事务管理不再有云遮雾罩的感觉。   第11章:讲解了如何使用Spring JDBC进行数据访操作,我们还重点讲述了LOB字段处理、主键产生和获取等难点知识。   第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访框架,同时,读者还将学习到ORM框架的混用和DAO层设计的知识。   第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。   第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。   第15章:对Spring MVC框架进行详细介绍,对REST风格编程方式进行重点讲解,同时还对Spring 3.0的校验和格式化框架如果和Spring MVC整合进行讲解。   第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。   第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、项目设计、代码开发、单元测试直到应用部署经历整个实际项目的整体开发过程。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧