spring事务

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

建立一个新的事物,如果现存一个事务就暂停它。

你可能感兴趣的:(java,spring,AOP,sql,配置管理)