1. 主要接口介绍
在Spring中,与事务相关的类或接口有以下三个:
Ø TransactionDefinition
TransactionDefinition的作用是定义一个事务的属性,比如传播属性、隔离属性、超时属性等。
Ø TransactionStatus
TransactionStatus记录一个运行时的事务。
Ø PlatformTransactionManager
PlatformTransactionManager的作用是管理事务。它包含三个方法,如下图所示:
其中getTransaction方法的作用是:根据TransactionDefinition定义的事务属性,返回一个相应的事务TransactionStatus,它可能代表一个新的事务,或可能代表一个现有的事务,如果在当前调用堆栈存在一个符合条件的事务。
PlatformTransactionManager的继承关系如下:
PlatformTransactionManager只是一个接口,它的具体实现跟具体的资源有关。如果是数据库就用DataSourceTransactionManager,如果是JMS的消息队列,就用JmsTransactionManager,等等。
下面以DataSourceTransactionManager为例,介绍getTransaction方法的实现。
getTransaction的第一步是通过doGetTransaction()获得一个transaction对象。具体实现如下:
DataSourceTransactionObject的实现如下:
由此可见,在DataSourceTransactionManager中,其管理的transaction对象,实质是一个数据库连接connection。
getTransaction的第二步是判断当前的transaction是新事务还是已存在的事务,如果是已存在的事务,则调用handleExistingTransaction方法。如果是新事务,则根据TransactionDefinition中设置的值,根据事务的传播属性等信息进行相应处理。
2. 事务管理的具体实现
Spring实现事务管理功能主要涉及的技术是AOP。如下图展示了事务管理的过程:
在执行用户的具体代码之前,创建事务;在执行完具体代码后,根据执行结果,进行commit或是rollback(抛出异常)。
下面以DataSourceTransactionManager说明Spring TransactionManager的执行过程。
首先在配置文件声明数据源,如下所示:
然后说明PlatformTransactionManager,本例是DataSourceTransactionManager。
假定我们需要对DefaultFooService(如上所示)操作的事务进行管理,定义具体的advice,如下所示:
将advice与pointcut通过advisor关联起来,如下图所示
3. Spring Transaction Manager的优势
传统上,Java EE的开发者有两个事务管理的选择:全局或本地事务。全局事务指的是一个事务涉及多个资源,如DataBase和Message Queue等。Spring的优点之一是它使应用开发人员可以使用一致的编程模型在两个环境下开发。
除此之外,相比于EJB,Spring在Transaction Manager方面的优势还体现在以下3点:
Ø Spring事务管理框架可以管理任何一个类,而不是想EJB仅仅是特殊的类。
Ø Spring事务管理框架可以自定义回滚规则,而EJB不行。
Ø Spring事务管理框架利用AOP技术运行用户插入自定义的事务行为,而EJB不行。
然而,Spring框架不支持跨越远程调用的事务上下文传播。原文描述如下:
“The Spring Framework does not supportpropagation of transaction contexts across remote calls, as do high-endapplication servers. If you need this feature, we recommend that you use EJB.However, consider carefully before using such a feature, because normally, onedoes not want transactions to span remote calls.”
参考连接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html