事务管理的输入层面包括定界、传播、隔离。将一组操作与事务作语义绑定称为定界。如果需多个组件在一组操作范围协作,其事务也应在这些组件间共享。隔离允许开发人员细致地调整事务间的隔离程度。
在Spring中,事务定界、传播和隔离均通过AOP工具来声明。在xml配置文件中可定义事务代理对象,或通过面向方面的语义来实现。事务代理的操作方法如下:
<bean id="bookingAgent" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager" />
<property name="target" ref="bookingAgentSpring" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
![]()
<bean id="bookingAgentSpring" class="org.jug.flight.booking.spring.BookingAgentSpring">
<property name="flightDAO" ref="flightDAO" />
<property name="ticketDAO" ref="ticketDAO" />
<property name="screener" ref="screener" />
</bean>
![]()
而EJB 3.0 中,所有会话 bean的公共方法自动应用了事务语义,不再需要专门的配置文件。并且通过注释或xml可微调事务传播级别。
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Ticket purchaseTicket(Ticket ticket)
{
...
}
EJB 3.0规范将事务隔离声明为针对资源管理,没有标准的表述方式。Spring集成了各种事务管理API 如JDBC, Hibernate, and JTA。而EJB 3.0仅支持JTA。
对于API的选择主要有两个要点:首先,并非所有的Java容器支持JTA(如Tomcat就不支持),尽管所有的EJB容器支持JTA。其次,如果某一分布式的事务操作涉及各种资源(JDBC , JMS),则JTA开发环境的支持是必须的。如果容器本身不提供JTA的支持,而又必须JTA的时候,可考虑采用开源的JTA实现如JOTM。
事务管理——小结
Spring 和 EJB 3.0均提供了与各自持久化机制相兼容针对事务处理的集成管理方式。(见表3)
表3. Spring和EJB 3.0事务管理功能性比较
|
特性
|
Spring
|
EJB 3.0
|
|
声明式事务
|
√
|
√
|
|
可编程事务
|
√
|
√
|
|
定界
|
AOP
|
会话 bean 方法
|
|
支持的事务类别
|
JDBC, Hibernate, JTA
|
JTA
|
|
分布式事务的支持
|
√ (With JTA)
|
√
|
|
配置
|
XML
|
默认情况下支持事务,通过注释或xml微调
|
|
标准
|
√ (With JTA)
|
√
|
