事务的嵌套概念
所谓事务的嵌套就是两个事务方法之间相互调用。spring事务开启 ,或者是基于接口的或者是基于类的代理被创建(注意一定要是代理,不能手动new 一个对象,并且此类(有无接口都行)一定要被代理——spring中的bean只要纳入了IOC管理都是被代理的)。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。
spring 事务异常处理
Spring默认情况下会对运行期例外(RunTimeException),即uncheck异常,进行事务回滚。如果遇到checked异常就不回滚。改变默认规则的方法如下 :
- 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
- 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
- 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
spring事务传播属性
在 spring的 TransactionDefinition接口中一共定义了六种事务传播属性:
-
PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
-
PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
-
PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
-
PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
-
PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
-
PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
-
PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
前六个策略类似于EJB CMT,第七个(PROPAGATION_NESTED)是Spring所提供的一个特殊变量。
它要求事务管理器或者使用JDBC 3.0 Savepoint API提供嵌套事务行为(如Spring的DataSourceTransactionManager)
网友评论