快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

Spring声明式事务管理源码解读之事务开始

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

这个是我昨天在解决问题是看源码得一点体验,可能说得比较大概,希望大家多多讨 论,把本贴得质量提高上去,因为spring实现的事务管理这部分我相信还是有点复杂的。 一个人未必能想得十分清楚

在spring的声明式事务管理中,它是如何判定一个及标记一个方法是否应该是处在事 务体之中呢。

首先要理解的是spring是如何来标记一个方法是否应该处在事务体之中的。有这样一 个接口TransactionDefinition,其中定义了很多常量,它还有一个子接口 TransactionAttribute,其中只有一个方法rollback。

TransactionDefinition中有很多常量定义,它们分别属于两种类型,传播途径和隔离 级别

代码

/*** Support a current transaction, create a new one if none 

exists.* Analogous to EJB transaction attribute of the same name.* 

<p>This is typically the default setting of a transaction 

definition.*/int PROPAGATION_REQUIRED = 0;

当然其中也定义了隔离级别

/** * A constant indicating that dirty reads are prevented; non-repeatable reads * and phantom reads can occur. This level only prohibits a transaction * from reading a row with uncommitted changes in it. * @see java.sql.Connection#TRANSACTION_READ_COMMITTED */ int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;

同时还有两个对应的方法来得到这样的传播途径和隔离级别

/** * Return the propagation behavior. * Must return one of the PROPAGATION constants. * @see #PROPAGATION_REQUIRED * @see org.springframework.transaction.support.TransactionSynchronizationManager#isAc tualTransactionActive() */ int getPropagationBehavior(); /** * Return the isolation level. * Must return one of the ISOLATION constants. * <p>Only makes sense in combination with PROPAGATION_REQUIRED or * PROPAGATION_REQUIRES_NEW. * <p>Note that a transaction manager that does not support custom * isolation levels will throw an exception when given any other level * than ISOLATION_DEFAULT. * @see #ISOLATION_DEFAULT */ int getIsolationLevel();

这个接口有一个默认的实现DefaultTransactionDefinition。然后它还有子类,比如 说

DefaultTransactionAttribute。Spring在判断一个方法是否需要事务体的时候其实是 创建一个TransactionAttribute实现的实例.

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

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

有了上面的简单介绍就可以进入真正判断是否需要事务的地方了。这个方法在 TransactionAspectSupport类里,

/** * Create a transaction if necessary. * @param method method about to execute * @param targetClass class the method is on * @return a TransactionInfo object, whether or not a transaction was created. * The hasTransaction() method on TransactionInfo can be used to tell if there * was a transaction created. */ protected TransactionInfo createTransactionIfNecessary(Method method, Class targetClass) { // If the transaction attribute is null, the method is non-transactional. final TransactionAttribute sourceAttr = this.transactionAttributeSource.getTransactionAttribute(method, targetClass);//就是在这里判断了这个方法的事务属性 TransactionAttribute txAttr = sourceAttr; //

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号