技术开发 频道

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

【IT168技术文档】
简介
:事务是所有企业应用系统的核心,之前人们使用ejb的时候,容器事务管理(CMT),是slsb最令人称道的地方,据说很多人使用ejb,使用slsb就是为了cmt,但是spring出现之后,格局就变了,因为程序员又多了一种选择,就是声明式事务管理,声明式事务管理是基于AOP的,及AOP是它的底层特性,本文的目的就是为了和大家探讨一下spring的声明式事务管理,从源代码来分析它的背后的思想。(谢谢异常的建议,因为本文原来没有简介

这个是我昨天在解决问题是看源码得一点体验,可能说得比较大概,希望大家多多讨论,把本贴得质量提高上去,因为spring实现的事务管理这部分我相信还是有点复杂的。一个人未必能想得十分清楚
在spring的声明式事务管理中,它是如何判定一个及标记一个方法是否应该是处在事务体之中呢。

首先要理解的是spring是如何来标记一个方法是否应该处在事务体之中的。有这样一个接口TransactionDefinition,其中定义了很多常量,它还有一个子接口TransactionAttribute,其中只有一个方法rollback。
TransactionDefinition中有很多常量定义,它们分别属于两种类型,传播途径和隔离级别

代码
 
  1. /**  
  2.      * Support a current transaction, create a new one if none exists.  
  3.      * Analogous to EJB transaction attribute of the same name.  
  4.      * <p>This is typically the default setting of a transaction definition.  
  5.      */  
  6.     int PROPAGATION_REQUIRED = 0;  
当然其中也定义了隔离级别
/**
代码
 
  1. * A constant indicating that dirty reads are prevented; non-repeatable reads   
  2.  * and phantom reads can occur. This level only prohibits a transaction   
  3.  * from reading a row with uncommitted changes in it.   
  4.  * @see java.sql.Connection#TRANSACTION_READ_COMMITTED   
  5.  */   
  6. int ISOLATION_READ_COMMITTED   = Connection.TRANSACTION_READ_COMMITTED;  
同时还有两个对应的方法来得到这样的传播途径和隔离级别
代码
 
  1. /**  
  2.      * Return the propagation behavior.  
  3.      * Must return one of the PROPAGATION constants.  
  4.      * @see #PROPAGATION_REQUIRED  
  5.      * @see org.springframework.transaction.support.TransactionSynchronizationManager#isActualTransactionActive()  
  6.      */  
  7.     int getPropagationBehavior();   
  8.   
  9.     /**  
  10.      * Return the isolation level.  
  11.      * Must return one of the ISOLATION constants.  
  12.      * <p>Only makes sense in combination with PROPAGATION_REQUIRED or  
  13.      * PROPAGATION_REQUIRES_NEW.  
  14.      * <p>Note that a transaction manager that does not support custom  
  15.      * isolation levels will throw an exception when given any other level  
  16.      * than ISOLATION_DEFAULT.  
  17.      * @see #ISOLATION_DEFAULT  
  18.      */  
  19.     int getIsolationLevel();  
这个接口有一个默认的实现DefaultTransactionDefinition。然后它还有子类,比如说
DefaultTransactionAttribute。Spring在判断一个方法是否需要事务体的时候其实是创建一个TransactionAttribute实现的实例.
0