java 自定义异常 未回滚_运用@Transactional,自己抛出异常时不会回滚的原因,经验之谈 | 学步园...

对EJB来说,默认的行为是EJB容器在遇到系统异常

(通常指运行时异常)时自动回滚当前事务。EJB CMT遇到应用异常

(例如,除了java.rmi.RemoteException

外别的checked exception)时并不会自动回滚。默认式Spring处理声明式事务管理的规则遵守EJB习惯(只在遇到unchecked exceptions时自动回滚),但通常定制这条规则会更有用。

所以

package x.y.service;

public class DefaultFooService implements FooService {

public Foo getFoo(String fooName) {

throw new UnsupportedOperationException();

}

public Foo getFoo(String fooName, String barName) {

throw new UnsupportedOperationException();

}

public void insertFoo(Foo foo) {

throw new UnsupportedOperationException();

}

public void updateFoo(Foo foo) {

throw new UnsupportedOperationException();

}

}

(对该例的目的来说,上例中实现类(DefaultFooService

)的每个方法在其方法体中抛出UnsupportedOperationException

的做法是恰当的,我们可以看到,事务被创建出来,响应UnsupportedOperationException

的抛出,然后回滚。)

@Transactional

有关的设置

在最简单的形式下,@Transactional

指定一个接口、类、方法必须是事务性的,其默认事务语义为:read/write,PROPAGATION_REQUIRED

,ISOLATION_DEFAULT

,TIMEOUT_DEFAULT

,而且仅当遇到RuntimeException

时回滚,而不是Exception

改变事务设置的其他可选属性

Table 9.1. Transactional

注解的属性

属性

类型

描述

传播性

枚举型:Propagation

可选的传播性设置 (默认值:PROPAGATION_REQUIRED

)

隔离性

枚举型:Isolation

可选的隔离性级别(默认值:ISOLATION_DEFAULT

)

只读性

布尔型

读写型事务 vs. 只读型事务(默认值:false

,即只读型事务)

回滚异常类(rollbackFor)

一组 Class

类的实例,必须是Throwable

的子类

一组异常类,遇到时 确保

进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException

的子类)才进行事务回滚。

回滚异常类名(rollbackForClassname)

一组 Class

类的名字,必须是Throwable

的子类

一组异常类名,遇到时 确保

进行回滚

不回滚异常类(noRollbackFor)

一组 Class

类的实例,必须是Throwable

的子类

一组异常类,遇到时确保 不

回滚。

不回滚异常类名(noRollbackForClassname)

一组 Class

类的名字,必须是Throwable

的子类

一组异常类,遇到时确保 不

回滚

我们推荐你参考 @Transactional

注解的javadoc,其中详细列举了上述各项属性及其可选值。

————————————————————————————————————

通过以上可知,在spring 中运用@Transactional

注解,自己抛出异常UnsupportedOperationException会

回滚,抛Exception异常,得作相关的配置才会回滚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值