boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);
return newTransactionStatus(definition, null, false, newSynchronization, debugEnabled, null);
}
}
接着通过调用prepareTransactionInfo完成事务创建的准备,创建过程中得到的信息 存储在TransactionInfo对象中进行传递同时把信息和当前线程绑定;
Java代码
protected TransactionInfo prepareTransactionInfo(
TransactionAttribute txAttr, String joinpointIdentification, TransactionStatus status) {
TransactionInfo txInfo = new TransactionInfo(txAttr, joinpointIdentification);
if (txAttr != null) {
.....
// 同样的需要把在getTransaction中得到的TransactionStatus放到 TransactionInfo中来。
txInfo.newTransactionStatus(status);
}
else {
.......
}
// 绑定事务创建信息到当前线程
txInfo.bindToThread();
return txInfo;
}
Spring源代码解析(六):Spring声明式事务处理(6)
时间:2011-03-29 javaeye jiwenke
将创建事务的信息返回,然后看到其他的事务管理代码:
Java代码
protected void commitTransactionAfterReturning(TransactionInfo txInfo) {
if (txInfo != null && txInfo.hasTransaction()) {
if (logger.isDebugEnabled()) {
logger.debug("Invoking commit for transaction on " + txInfo.getJoinpointIdentification());
}
this.transactionManager.commit(txInfo.getTransactionStatus ());
}
}
通过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 ());
}
}
Spring通过以上代码对transactionManager进行事务处理的过程进行了AOP包装,到这 里我们看到为了方便客户实现声明式的事务处理,Spring还是做了许多工作的。如果说使 用编程式事务处理,过程其实比较清楚,我们可以参考书中的例子:
Java代码
TransactionDefinition td = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(td);
try{
......//这里是我们的业务方法
}catch (ApplicationException e) {
transactionManager.rollback(status);
throw e
|