运用@Transactional,本身抛出异常时不会回滚的缘由,经验之谈

查看spring API可知 http://www.kuqin.com/spring2.0_doc/index.html html

对EJB来讲,默认的行为是EJB容器在遇到系统异常 (一般指运行时异常)时自动回滚当前事务。EJB CMT遇到应用异常 (例如,除了java.rmi.RemoteException 外别的checked exception)时并不会自动回滚。默认式Spring处理声明式事务管理的规则遵照EJB习惯(只在遇到unchecked exceptions时自动回滚),但一般定制这条规则会更有用。java

因此spring

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();
}
}spa

(对该例的目的来讲,上例中实现类(DefaultFooService )的每一个方法在其方法体中抛出UnsupportedOperationException 的作法是恰当的,咱们能够看到,事务被建立出来,响应UnsupportedOperationException 的抛出,而后回滚。) htm

@Transactional 有关的设置blog

在最简单的形式下,@Transactional 指定一个接口、类、方法必须是事务性的,其默认事务语义为:read/write,PROPAGATION_REQUIREDISOLATION_DEFAULTTIMEOUT_DEFAULT ,并且仅当遇到RuntimeException 时回滚,而不是Exception接口

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

Table 9.1. Transactional 注解的属性 get

属性 类型 描述
传播性 枚举型: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 的子类 一组异常类,遇到时确保 回滚
属性 类型 描述
传播性 枚举型: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 的子类 一组异常类,遇到时确保 回滚
属性 类型 描述
传播性 枚举型: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,其中详细列举了上述各项属性及其可选值。it

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

经过以上可知,在spring 中运用@Transactional 注解,本身抛出异常UnsupportedOperationException会 回滚,抛Exception异常,得做相关的配置才会回滚。

相关文章
相关标签/搜索