专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
Java编程精选  ·  雷军删文,热搜第一! ·  2 天前  
芋道源码  ·  如何实现一个合格的分布式锁 ·  昨天  
51好读  ›  专栏  ›  ImportNew

JavaEE – JPA(2):EJB中的事务管理

ImportNew  · 公众号  · Java  · 2016-12-13 21:09

正文

请到「今天看啥」查看全文



事务划分概要


Resource-local事务类型


在上文中我们已经知道Resource-local事务类型实际上就是直接建立在JDBC标准的中的DataSource接口之上的一种事务类型,它直接建立在底层数据库所支持的事务之上,因此十分底层。而在往常的JDBC编程中,这是最常用的一种方式,正因为它的抽象层次低,需要开发人员百分百地控制事务的划分,使用代码指定事务的开始结束等生命周期。随着JavaEE标准的诞生,以及Web开发大行其道,出现的应用服务器(Application Server)则在最底层的基于DataSource接口的事务模型之上抽象出来基于Container的事务类型,这也是当今JavaEE开发中最常见,也是最常用的一种事务类型。下文即将讨论的都属于Container事务的范畴。


Container事务类型


在这种事务类型中,由于应用服务器提供的容器对事务提供了一定程度的支持,因此有下面两种实现思路:


  1. 在容器的帮助下完成自动划分

  2. 使用JTA接口在应用中编码完成显式划分


EJB中的事务划分


回顾了一下事务划分是什么,下面开始正式介绍EJB是如何处理事务划分的。


容器管理的事务(Container-Managed Transaction, CMT)


首先,在EJB中默认的事务划分实现方式就是基于容器管理的事务(CMT)。所以你什么都不指定,那么就会默认使用CMT了。当然也可以显式指定:


@Stateful

@TransactionManagement(TransactionManagementType.CONTAINER)

public class BusinessLogicBean implements IBusinessLogic {

//  根据不同的元数据定义(通过@TransactionAttribute),其中的方法会被运行在由容器创建的事务中(如果声明了需要事务)

public void business() {}

}


因此,一个定义其中的方法具体是否需要使用事务,使用的事务具有什么样的特征,都是通过@TransactionAttribute这个注解来完成的。下面就来看看这个注解定义了那些可选项:


  • MANDATORY: 运行当前方法时要求存在处于active状态的事务。如果没有active状态的事务则会抛出异常。


  • REQUIRED: 运行当前方法时,希望处于事务中。当容器碰到这个注解时,会检查当前是否存在active状态的事务。如果存在,就直接使用它;如果不存在,就创建(create)一个供它使用。(这个选项是最常用的,也是默认选项)







请到「今天看啥」查看全文