Spring事务管理对两种异常的处理
uncheck 未捕获异常 即RuntimeException,进行事务回滚
对checked异常,认为程序必须处理,则发生时不进行回滚,但是可以通过rollbackFor和noRollbackFor来灵活配置。
事务的传播行为:
1.PROPAGATION_MANDATORY 方法必须在一个现存的事务中进行,否则丢出异常。
@Transactional(propagation=Propagation.MANDATORY) public void delete(int id) throws Exception{ jdbcTemplate.update("delete from person where pid=?", new Object[]{id}, new int[]{java.sql.Types.INTEGER}); }
如果上述方法不是在一个现存事务中调用,则抛出异常:
Exception in thread "main" org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:363)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy5.delete(Unknown Source)
at com.jdbc.test.TransactionTest.main(TransactionTest.java:28)
2.PROPAGATION_REQUIRED 支持当前的事务,当前没有事务则新建事务
@Transactional(propagation=Propagation.REQUIRED) public void delete(int id) throws RuntimeException{ jdbcTemplate.update("delete from person where pid=?", new Object[]{id}, new int[]{java.sql.Types.INTEGER}); throw new RuntimeException("运行期异常"); }
I 如果调用该方法时,没有事务,则新起一个事务,方法里发生异常,回滚事务。
II如果调用方法也声明为REQUIRED,则加入当前事务,无论在该方法中,还是在调用完该方法后发生异常,该方法和调用该方法的事务都发生回滚。
3.PROPAGATION_SUPPORTS
如果方法delete被声明为Propagation.SUPPORTS则根据调用者来决定,如果方法调用者处在一个事务中,则其加入事务,出现异常进行回滚,如果方法调用者不在一个事务中,那么,该方法即使发生异常也不回滚。
4.PROPAGATION_NEVER
声明方法不应在事务中进行,如果有,则抛出如下异常:
Exception in thread "main" org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation 'never'
at org.springframework.transaction.support.AbstractPlatformTransactionManager.handleExistingTransaction(AbstractPlatformTransactionManager.java:403)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:353)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
5.PROPAGATION_NESTED
加入当前事务,子事务和父事务任何出现异常,则都回滚。
6.PROPAGATION_NOT_SUPPORTED
方法不应该在事务中进行,如果有,则暂停当前事务。
7.PROPAGATION_REQUIRES_NEW
建立一个新的事物,如果现存一个事务就暂停它。