博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Transaction rolled back because it has been marked as rollback-only
阅读量:6244 次
发布时间:2019-06-22

本文共 1569 字,大约阅读时间需要 5 分钟。

转自:https://blog.csdn.net/launch_225/article/details/7814346

原来是这样设置的:

 

 

Xml代码  
  1. <tx:attributes>  
  2.   
  3.            <tx:method name="*" read-only="true"/>  
  4.   
  5.        </tx:attributes>  
 

 

发现selectA调用selectB,如果selectB抛出Exception,selectA中捕获Exception但是并不继续向外抛出,最后会出现错误。

 

纠其原理其实很简单,在selectB返回的时候,transaction被设置为rollback-only了,但是selectA正常消化掉,没有继续向外抛。

那么selectA结束的时候,transaction会执commit操作,但是transaction已经被设置为rollback-only了。

所以会出现这个错误。

有的同学说了,那不是没得搞了,service不能抛出异常,或者不能拦截异常了?

其实不然,其实错误不在这里,而是select这种操作为什么要启动事务呢?

调整好问题,找解决方案,问题就出现在propagation="REQUIRED"这个属性上。

标准文档上这样写:

 
          Support a current transaction, throw an exception if none exists.
 
          Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else.
 
          Execute non-transactionally, throw an exception if a transaction exists.
 
          Execute non-transactionally, suspend the current transaction if one exists.
 
          Support a current transaction, create a new one if none exists.
 
          Create a new transaction, suspend the current transaction if one exists.
 
          Support a current transaction, execute non-transactionally if none exists.

 

看来我们需要如下修改:

 

 

Xml代码  
  1. <tx:attributes>  
  2.   
  3.            <tx:method name="*" read-only="true" propagation="NOT_SUPPORTED"/>  
  4.   
  5.        </tx:attributes>  
 

这样select这样的检索操作根本就不启动事务了,而且在有事务的方法中也是可以正常调用select方法的。

现在就没问题了。

但是现在出现了另外一个问题,就是,如果在一个事物内对db进行操作,然后在出事物之前对刚才db操作的数据进行select是获取不到修改结果的,为什么呢?因为not——supported是会在执行select之前挂起原有事物,不在原有事物内,当然无法获得修改后的数据。

怎么办?改成supports:

 

  

Xml代码  
  1. <tx:attributes>  
  2.   
  3.        <tx:method name="*" read-only="true" propagation="SUPPORTS"/>  
  4.   
  5.    </tx:attributes>  
 

 

这个状态用一句话概括就是“有则加入事物,无也不创建事物”。

转载于:https://www.cnblogs.com/sharpest/p/7719090.html

你可能感兴趣的文章
mysql分隔字符串,并将分隔字符串作为新列
查看>>
图学java基础篇之集合
查看>>
Tomcat源码分析------ 架构
查看>>
如何分析并策划好网站
查看>>
解决Skype一台电脑登陆多个账号的问题
查看>>
Gradle构建卡住问题解决
查看>>
linux使用cron任务定时执行数据库操作
查看>>
实验11 原始套接字
查看>>
C#配置Properties.Setting
查看>>
Tomcat:为Filter过滤器设置参数
查看>>
在线编辑、展示HTML、CSS、Javascript的网站
查看>>
java读取csv文件
查看>>
js判断是否为360浏览器
查看>>
京华科讯存储虚拟化技术
查看>>
Python模板库Mako的用法
查看>>
Spring整合shiro,使用jdbcTmplate操作SessionDAO
查看>>
Hibernate所鼓励的7大措施
查看>>
Python对进程Multiprocessing基础
查看>>
Shell脚本语法
查看>>
scrapy与xpath的坑
查看>>