1、Spring事务原理
spring实现对事务的控制,使用的是代理的技术。通过生成的代理类来捕捉被代理类的异常,决定事务的提交或回滚。从某一角度来说,spring事务是基于异常实现的。
Spring事务的本质其实就是数据库对事务的支持,其底层是依赖于数据库事务的,或者说,Spring事务是数据库事务的封装应用。相对于数据库事务,Spring事务可以对指定的类的方法添加事务,并通过配置管理简化开发,且Spring有强大的事务传播机制。
2、Spring事务传播机制
事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法(不一定在事务内)的时事务如何传播。
Spring事务传播机制有7种属性:
-
PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是spring事务传播机制的默认值。
-
PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。
-
PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。
-
PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。
-
PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
-
PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常。
-
PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
3、Spring事务代码
先看一下Spring提供的事务执行方法,方法内包含了提交和异常时的回滚,我们也可以利用Spring提供的PlatformTransactionManager自己重写excute方法,决定何时提交和回滚。
public <T> T execute(TransactionCallback<T> action) throws TransactionException {
if(this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
return ((CallbackPreferringPlatformTransactionManager)this.transactionManager).execute(this, action);
} else {
TransactionStatus status = this.transactionManager.getTransaction(this);
Object result;
try {
result = action.doInTransaction(status);
} catch (RuntimeException var5) {
this.rollbackOnException(status, var5);
throw var5;
} catch (Error var6) {
this.rollbackOnException(status, var6);
throw var6;
} catch (Exception var7) {
this.rollbackOnException(status, var7);
throw new UndeclaredThrowableException(var7, "TransactionCallback threw undeclared checked exception");
}
this.transactionManager.commit(status);
return result;
}
}