JavaEE中的事务管理——事务划界

前面博文中大致介绍了一下事务,其实在企业应用服务器中事务是在不同的级别上存在的。比较简单的事务是最底层的事务,就是位于资源级别的事务管理。假设数据最终要存储在一个关系型数据库中,那么最底层的事务就是位于这里。我们把这种事务称之为资源本地事务(resource-localtransaction)在不用容器的大部分情况下开发人员要面对的事务都属于这里(其他的事务面对不到是因为水平不够!)。理解了数据的事务之后来解决资源本地事务就易如反掌了。如果使用了企业应用服务器那么要处理的大多数事务就是JavaTransaction API(java事务API,简称JTA)了,这些API适用于所有实现JavaEE标注的服务器。既然容器插手了事务那么就要为开发者服务,所以在处理多资源的时候可以为开发者提供便利。在容器事务中还可以使用Java连接器体系结构(JavaConnector Architecture,JCA)组件定义的资源。(这是官方文档上的话其实笔者也不是很懂;P)

在容器中的事务通常是在JDBC之上添加自己的处理规则,用以执行连接管理和池化等功能。简单的说就是为了将开发人员从JDBC繁琐的操作中解脱出来,由容器去完成那些可以让机器完成的事情。当然了容器本身的事务完成之后它会执行数据源的提交或者回滚操作(以前这是要开发人员手动干预的)。

比一般的事务更加犀利的是容器的事务是可以跨数据源的,所以容器事务还有另外的名字——JTA事务(还可以叫全局事务global transaction)。

下面来说说事务划界(transaction demarcation)的问题。众所周知一个事务要么成功即将数据提交到数据库中,或者回滚即什么都不做。那么引起事务完成或者回滚的行为我们称之为事务划界。其实划界还可以有另一种更加简单理解方式,所谓事务划界就是两个事务之间的界限,那么怎么区分界限呢?只有一个事务完成才是另一个事务的开始,所以说事务的提交或者回滚标志着这个事务完成了。在不使用容器的时候就资源本地事务而言是由开发人员显示的进行提交或者回滚的。当使用容器的时候情况就不一样了,因为容器为开发人员封装了许多东西,所以在划界的时候开发人员既可以完全交由容器处理,也可以自己稍加干涉。前一种完全交给容器控制我们称之为容器托管(container-managed)的事务管理;而后一种方式我们称之为bean托管(bean-managed)的事务管理。

在使用EJB容器的时候我们任意选择两种事务管理方式,但是当使用servlet容器的时候就只能选择bean托管的事务。在EJB容器中默认是容器管理的,当然像下面代码这样也可以配置成bean托管的事务。

@Stateless
@TransactionManagement(TransactionManagementType.Bean)
public class ProjectServiceBean implements ProjectService {
    // methods here
}

因为EJB容器中事务默认是容器托管的,所以只有当我们期望bean托管的时候才特定的制定上面的注解。

后面的文章将分别介绍容器托管事务和bean托管事务。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。