通过transactionManager对事务进行处理,包括异常抛出和正常的提交事务,具体的事务管理器由用户程序设定。
Java代码
protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) { if (txInfo != null txInfo.hasTransaction()) { if (txInfo.transactionAttribute.rollbackOn(ex)) { …… try { this.transactionManager.rollback(txInfo.getTransactionStatus()); } …… } else { …… try { this.transactionManager.commit(txInfo.getTransactionStatus()); } …… } protected void commitTransactionAfterReturning(TransactionInfo txInfo) { if (txInfo != null txInfo.hasTransaction()) { …… this.transactionManager.commit(txInfo.getTransactionStatus()); } } protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) { if (txInfo != null txInfo.hasTransaction()) { if (txInfo.transactionAttribute.rollbackOn(ex)) { …… try { this.transactionManager.rollback(txInfo.getTransactionStatus()); } …… } else { …… try { this.transactionManager.commit(txInfo.getTransactionStatus()); } …… } protected void commitTransactionAfterReturning(TransactionInfo txInfo) { if (txInfo != null txInfo.hasTransaction()) { …… this.transactionManager.commit(txInfo.getTransactionStatus()); } } |
Spring通过以上代码对transactionManager进行事务处理的过程进行了AOP包装,到这里我们看到为了方便客户实现声明式的事务处理,Spring还是做了许多工作的。如果说使用编程式事务处理,过程其实比较清楚,我们可以参考书中的例子:
Java代码
TransactionDefinition td = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(td); try{ ……//这里是我们的业务方法 }catch (ApplicationException e) { transactionManager.rollback(status); throw e } transactionManager.commit(status); …… TransactionDefinition td = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(td); try{ ……//这里是我们的业务方法 }catch (ApplicationException e) { transactionManager.rollback(status); throw e } transactionManager.commit(status); …… |