方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。
和编程式事务相比,声明式事务唯一不足地方是最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。
transactionTemplate.execute方法:
一、
1.如果PlatformTransactionManager的实例是CallbackPreferringPlatformTransactionManager类型的
就调用WebSphereUowTransactionManager的execute方法
–(PlatformTransactionManager.execute)
WebSphereUowTransactionManager extends JtaTransactionManager extends AbstractPlatformTransactionManager implements PlatformTransactionManager
delegating 授(权); 把(工作、权力等)委托(给下级); 选派(某人做某事)
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = 1;
int ISOLATION_READ_COMMITTED = 2;
int ISOLATION_REPEATABLE_READ = 4;
int ISOLATION_SERIALIZABLE = 8;
int TIMEOUT_DEFAULT = -1;
参数:
TransactionDefinition definition, TransactionCallback callback
definition 是this,也就是transactionTemplate
callback,是action,也就是业务方法中传入的多个操作
2.如果TransactionDefinition为空就创建一个DefaultTransactionDefinition
3.如果TransactionDefinition.getTimeout() < -1,抛出异常,提示Invalid transaction timeout
4.否则就获取传播行为propagationBehavior
5.定义 existingTx = uowManager.getUOWStatus() != 5 && this.uowManager.getUOWType() != 0
6.如果existingTx 为真,并且传播行为的值为5,提示事务的传播行为是never,但是发现了一个存在的事务
7.如果传播行为的值为6,提示传播行为是nested,不支持WebSphere UOW事务
8.当传播行为不等于0,1,2时
9.传播行为是4时,uowType = 0(前面的代码初始化为1);newSynch=事务同步getTransactionSynchronization是否等于0的布尔值
10.传播行为不是4时,也就是3时,newSynch值为getTransactionSynchronization是否不等于2的布尔值
11.当传播行为等于0,1,2时,joinTx置为true(之前为false),newSynch值getTransactionSynchronization是否不等于2的布尔值
12.existingTx为false
13.当传播行为是2的时候,提示传播行为是mandatory,但是没有存在的事务
14.如果传播行为不等于1,4,5newSynch的值为 this.getTransactionSynchronization() != 2
15.如果传播行为等于1,4,5 uowType = 0;newSynch = this.getTransactionSynchronization() == 0;
16.开启日志debug : logger.isDebugEnabled()
17.定义SuspendedResourcesHolder,如果joinTx为false,则值为this.suspend方法的结果(suspend的暂时不分析),否则值为null
18.如果TransactionDefinition.getTimeout() > -1,则设置UOWManager.setUOWTimeout=TransactionDefinition.getTimeout()
19.创建UOWActionAdapter 动作适配器,参数:(TransactionDefinition)definition, callback, uowType == 1, !joinTx, newSynch, debug
20.执行UOWManager.runUnderUOW方法,参数:uowType, joinTx, action
21.得到结果action.getResult(),并且返回
二、如果PlatformTransactionManager的实例不是CallbackPreferringPlatformTransactionManager类型的
1.获得transaction的状态:TransactionStatus status = this.transactionManager.getTransaction(this);
2.以状态为参数执行多个业务方法。action.doInTransaction(status);
3.完成以后提交
4.如果发生错误,异常则执行回滚方法。
5.result = action.doInTransaction(status);是执行业务操作
PlatformTransactionManager.commit实现方法 AbstractPlatformTransactionManager.commit详解
1.如果事务的状态是完成,抛出异常:事务已经完成,一个事务不要多次调用提交和调用操作
2.否则,如果DefaultTransactionStatus的状态的rollbackOnly属性为true,执行回退操作
3.如果!this.shouldCommitOnGlobalRollbackOnly() && defStatus.isGlobalRollbackOnly()条件成立,执行回退操作
4.如果status.isNewTransaction() || this.isFailEarlyOnGlobalRollbackOnly()成立,抛出异常
5.上面所有的条件都不符合的时候,就开始执行commit的操作
提交操作:processCommit(defStatus);
1.prepareForCommit(status) 提交前的准备操作
2.triggerBeforeCommit 触发提交前同步
3.triggerBeforeCompletion触发完成前同步
4.如果事务有保存点,status.releaseHeldSavepoint(); 释放持有的保存点
5.this.doCommit(status) 执行提交操作。