对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异常,得作相关的配置才会回滚。