Java 虽然引发了异常,但事务未回滚
目前,我们在应用程序中面临一个与spring事务相关的问题。 如您所见,在Java 虽然引发了异常,但事务未回滚,java,spring,exception,spring-transactions,Java,Spring,Exception,Spring Transactions,目前,我们在应用程序中面临一个与spring事务相关的问题。 如您所见,在deleteRecord()中,我们正在执行一个DB操作。但是在下一行 抛出一个业务异常 预期行为(据我所知): 当从下一行抛出异常时,应该回滚DB操作 实际行为: 它不会后退。正在将数据插入到表中 问题: 为什么事务没有回滚?我不认为这是因为抓块 因为deleteRecord()将在新事务中执行。如果我错了,请纠正我 代码: class A { void myMethod() { for(int
deleteRecord()
中,我们正在执行一个DB操作。但是在下一行
抛出一个业务异常
预期行为(据我所知):
当从下一行抛出异常时,应该回滚DB操作
实际行为:
它不会后退。正在将数据插入到表中
问题:
为什么事务没有回滚?我不认为这是因为抓块
因为deleteRecord()
将在新事务中执行。如果我错了,请纠正我
代码:
class A {
void myMethod() {
for(int i=0 ; i<count ; i++) {
try {
deleteRecord();
} catch(Exception e) {
log.error("Exception caught");
}
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
deleteRecord() throws Exception{
line 1 : deleting record
line 2 : Throwing business exception
}
}
A类{
void myMethod(){
对于(int i=0;i更改为
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
Spring文档说明如下:
虽然EJB的默认行为是EJB容器在系统异常(通常是运行时异常)时自动回滚事务,但EJB CMT不会在应用程序异常(即除java.rmi.RemoteException之外的已检查异常)时自动回滚事务。虽然声明性事务管理的Spring默认行为遵循EJB约定(只有在未检查的异常情况下才会自动回滚),但定制此操作通常很有用
及
在默认配置中,Spring框架的事务
在这种情况下,基础结构代码仅标记要回滚的事务
对于运行时,未检查的异常;也就是说,当抛出异常时
是RuntimeException的实例或子类-
默认情况下-导致回滚)。已检查并引发的异常
在默认情况下,来自事务性方法的操作不会导致回滚
配置
见16.5.3:
这表示事务的默认行为将仅回滚RuntimeException
s。如果您有自己的业务异常(可能是选中的异常),则必须显式命名事务应回滚的异常类:
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = YOUREXCEPTION.class)
这是因为@Transaction方法由同一类中的方法调用,如果未将Spring配置为使用AspectJ,则该方法不起作用
即使我不使用rollboor
它也应该正常工作?这取决于您的CustomException类。如果您不使用“rollboor”,则默认行为是“回滚RuntimeException和Error,但不回滚checked Exception”,明白了。谢谢!