快速业务通道

Spring声明式事务管理源码解读之事务提交 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
pose current TransactionStatus, preserving any existing transactionStatus for        // restoration after this transaction is complete.        oldTransactionInfo = (TransactionInfo) currentTransactionInfo.get();        currentTransactionInfo.set(this);      }

Spring声明式事务管理源码解读之事务提交(2)

时间:2011-03-29 javaeye 张荣华

如果当前线程中已经有了一个TransactionInfo,则拿出来放到新建的 transactionInfo对象的oldTransactionInfo属性中,然后再把新建的TransactionInfo设 置到当前线程中。

这里有一个概念要搞清楚,就是TransactionInfo对象并不是表明事务状态的对象,表 明事务状态的对象是TransactionStatus对象,这个对象同样是TransactionInfo的一个属 性(这一点,我在前面一篇文章中并没有讲清楚)。

接下来BService中的那个方法返回,那么该它退栈了,它退栈后要做的就是doFinally 方法,即把它的oldTransactionInfo设置到当前线程中(这个TransactionInfo对象显然 就是AService方法入栈时创建的,怎么现在又要设置到线程中去呢,原因就是BService的 方法出栈时并不提交事务,因为BService的传播途径是required,所以要把栈顶的方法所 创建transactioninfo给设置到当前线程中),即调用AService的方法时所创建的 TransactionInfo对象。那么在AServie的方法出栈时同样会设置TransactionInfo对象的 oldTransactionInfo到当前线程,这时候显然oldTransactionInfo是空的,但AService中 的方法会提交事务,所以它的oldTransactionInfo也应该是空了。

在这个小插曲之后,么接下来就应该是到提交事务了,之前在AService的方法出栈时 ,我们拿到了它入栈时创建的TransactionInfo对象,这个对象中包含了AService的方法 事务状态。即TransactionStatus对象,很显然,太显然了,事务提交中的任何属性都和 事务开始时的创建的对象息息相关,这个TransactionStatus对象哪里来的,我们再回头 看看createTransactionIfNessary方法吧:

Java代码

protected TransactionInfo createTransactionIfNecessary(Method method, Class targetClass) {        txInfo.newTransactionStatus (this.transactionManager.getTransaction(txAttr));      }

再看看transactionManager.getTransaction(txAttr)方法吧:

Java代码

public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {      else if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||          definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||        definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {        if (debugEnabled) {          logger.debug("Creating new transaction with name [" + definition.getName() + "]");        }        doBegin(transaction, definition);        boolean newSynchronization = (this.transactionSynchronization != SYNCHRONIZATION_NEVER);        return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null);//注意这里的返回值,返回的就是一个 TransactionStatus对象,这个对象表明了一个事务的状态,比如说是否是一个新的事务, 事务是否已经结束,等等,这个对象是非常重要的,在事务提交的时候还是会用到它的。     }     

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号