正文
事务划分概要
Resource-local事务类型
在上文中我们已经知道Resource-local事务类型实际上就是直接建立在JDBC标准的中的DataSource接口之上的一种事务类型,它直接建立在底层数据库所支持的事务之上,因此十分底层。而在往常的JDBC编程中,这是最常用的一种方式,正因为它的抽象层次低,需要开发人员百分百地控制事务的划分,使用代码指定事务的开始结束等生命周期。随着JavaEE标准的诞生,以及Web开发大行其道,出现的应用服务器(Application Server)则在最底层的基于DataSource接口的事务模型之上抽象出来基于Container的事务类型,这也是当今JavaEE开发中最常见,也是最常用的一种事务类型。下文即将讨论的都属于Container事务的范畴。
Container事务类型
在这种事务类型中,由于应用服务器提供的容器对事务提供了一定程度的支持,因此有下面两种实现思路:
-
在容器的帮助下完成自动划分
-
使用JTA接口在应用中编码完成显式划分
EJB中的事务划分
回顾了一下事务划分是什么,下面开始正式介绍EJB是如何处理事务划分的。
容器管理的事务(Container-Managed Transaction, CMT)
首先,在EJB中默认的事务划分实现方式就是基于容器管理的事务(CMT)。所以你什么都不指定,那么就会默认使用CMT了。当然也可以显式指定:
@Stateful
@TransactionManagement(TransactionManagementType.CONTAINER)
public class BusinessLogicBean implements IBusinessLogic {
// 根据不同的元数据定义(通过@TransactionAttribute),其中的方法会被运行在由容器创建的事务中(如果声明了需要事务)
public void business() {}
}
因此,一个定义其中的方法具体是否需要使用事务,使用的事务具有什么样的特征,都是通过@TransactionAttribute这个注解来完成的。下面就来看看这个注解定义了那些可选项: