博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jpa transaction 回滚_如何让Spring @Transactional回滚所有未捕获的异常?
阅读量:4579 次
发布时间:2019-06-08

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

我的Spring / Java Web应用程序具有可以触及数据库的@Transactional服务:

@Transactional

public class AbstractDBService { ... }

所需的功能适用于任何未被捕获的throwable,它会在服务层之外传播,从而导致回滚.有点惊讶这不是默认行为,但经过一些谷歌搜索后尝试:

@Transactional(rollbackFor = Exception.class)

这似乎有效,除非故意吞下异常并且不再重新抛出异常. (特殊情况是当找不到实体时.猜测这可以重新设计为不抛出异常,但期望不可避免地存在其他异常 – 例如,当使用Thread.sleep()时,一个想到的是InterruptedException.然后春天抱怨:

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is

javax.persistence.RollbackException: Transaction marked as

rollbackOnly

…truncated..

Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly

at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:58)

at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)

我在这里错过了什么吗?…有没有办法告诉Spring回滚所有未被捕获的扔掉的东西?

解决方法:

如果要回滚所有未捕获的Throwable,可以在注释中指定:

@Transactional(rollbackFor = Throwable.class)

默认情况下,Spring不会为Error子类回滚,可能是因为一旦抛出一个错误,JVM将处于一个足够好的状态,无论如何都要对它做任何事情似乎都是值得怀疑的,此时事务可能会超时. (如果在引发OutOfMemoryError时尝试回滚,最可能的结果是另一个OutOfMemoryError.)因此,您可能无法获得太多收益.

当你提到吞下一个异常的情况时,Spring不可能知道它,因为异常没有找到Spring的代理(它实现了事务功能).这就是你的RollbackException示例中发生的事情,Hibernate已经发现事务需要回滚但是Spring没有得到备忘录,因为有人吃了这个例外.所以Spring没有回滚事务,它认为一切正常并尝试提交,但由于Hibernate标记了事务回滚,提交失败.

答案是不要吞下这些例外,而是让它们被抛出;让它们不受控制应该会让你更容易做正确的事情.应该设置一个异常处理程序来接收从控制器抛出的异常,在应用程序的任何级别抛出的大多数异常都可以被捕获并记录.

标签:java,spring,jpa,hibernate,transactions

来源: https://codeday.me/bug/20190724/1526537.html

转载地址:http://ulqms.baihongyu.com/

你可能感兴趣的文章
axure 导入元件库显示不出白框_猿型库:Axure小练习之自定义下拉框
查看>>
两个集合相减怎么算_你家使用的防火窗(耐火窗)质量合格吗?怎么判断好坏呢?...
查看>>
ue4加载本地图片_UE4引擎初始化原理详细讲解
查看>>
python整数作为条件_Python整数类型(int)详解
查看>>
pta简单实现x的n次方_c语言第二次作业pta..docx
查看>>
【Entity Framework】Model First Approach
查看>>
C# DataTable删除行Delete与Remove的问题
查看>>
HDU2586How far away? LCA
查看>>
网络流 - 最大流
查看>>
随手记note(记事簿)
查看>>
JRE System Library 与Java EE Libraries的区别
查看>>
颜色分类函数
查看>>
Oracle数据泵详解
查看>>
(中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。
查看>>
sort-归并排序
查看>>
django 快速实现完整登录系统(cookie)
查看>>
.NET中的out和ref关键字
查看>>
Python之ftp服务器
查看>>
KMP预处理
查看>>
oracle的wm_concat函数实现行转列
查看>>