104

我有如下疑问:

  1. 这两者有什么区别?
  2. 所有数据库都支持这两者吗?
  3. JPA TransactionManager和JTA Transaction Manager是否不同?

4个答案4

重置为默认值
109

JPA实现可以选择管理事务本身(资源_本地)或由应用服务器的JTA实现管理它们。

在大多数情况下,RESOURCE_LOCAL都可以。这将使用基本的JDBC级事务。缺点是事务是JPA持久性单元的本地事务,因此如果您想要一个跨多个持久性单元(或其他数据库)的事务,那么RESOURCE_local可能不够好。

JTA还用于跨JMS和JCA等系统管理事务,但对我们大多数人来说,这是一种非常奇特的用法。

要使用JTA,您需要在应用程序服务器中支持它,还需要JDBC驱动程序的支持。

2
  • 似乎glassfih不允许我使用resource_local,我该怎么做? 评论 2012年12月16日18:08
  • 4
    作为旁注:通过使用第三方解决方案,即使没有完整的Java EE应用程序服务器,也可以获得JTA功能,例如阿托米科斯因此,您可以拥有像Tomcat这样的轻量级web容器,并且仍然可以获得JTA支持。
    – 信息01
    评论 2016年9月13日11:15
100

作为其他答案的补充

这里有一个摘录摘自非常有用的文章(发表在阿帕奇TomEE网站),这也可以帮助回答OP的第一个问题(文章链接如下)。


比较RESOURCE_LOCAL和JTA持久性上下文


使用<持久性-单位transaction-type=“RESOURCE_LOCAL”> 负责EntityManager(PersistenceContext/Cache)正在创建和跟踪。。。

  • 必须使用实体管理器工厂获取EntityManager
  • 产生的结果实体管理器实例持久化上下文/缓存
  • 实体管理器工厂可以通过@持久性单元仅注释(不@持久性上下文)
  • 你是允许使用@PersistenceContext引用类型为RESOURCE_LOCAL的单元
  • 必须使用实体事务处理要开始/提交的API每一个致电您的EntityManger
  • 打电话entityManagerFactory.createEntityManager()两次会导致独立的EntityManager实例及其单独的PersistenceContexts/Caches。
  • 几乎从来没有有一个以上的好主意实例正在使用的EntityManager的第二个,除非你摧毁了第一个)


使用<持久性-单位transaction-type=“JTA”>这个集装箱将执行EntityManager(PersistenceContext/Cache)正在创建和跟踪。。。

  • 不能使用实体管理器工厂获取EntityManager
  • 你只能得到实体管理器由提供容器
  • 实体管理器可以通过@持久性上下文仅注释(不是@PersistenceUnit)
  • 你是允许使用@PersistenceUnit引用JTA型装置
  • 这个实体管理器由提供容器是一个参考与JTA事务关联的PersistenceContext/Cache。
  • 如果没有JTA事务正在进行,则EntityManager无法使用因为没有PersistenceContext/Cache。
  • 每个拥有EntityManager的人对的引用同一单位在中相同的交易将自动引用相同的PersistenceContext/Cache
  • 这个PersistenceContext/Cache是冲洗并于联合战术分析犯罪时间

任何有兴趣学习Java Persistence API的人,请帮自己一个忙,阅读本文全文:JPA概念:JPA 101.

9
  • 11
    只想补充一点:如果你正在使用Spring,你可以在Resource_Local中使用@PersistenceContext和EntityManager。在这种情况下,Spring容器可以使用@Transactional注释管理事务。
    – 山姆
    评论 2015年6月23日12:09
  • 在我的项目中事务处理类型=资源_本地@持久性上下文@事务性由Spring管理 评论 2016年3月1日16:22
  • 由于你提供的链接,我正在击打面朝上的三角形。 评论 2017年5月23日18:08
  • @Koray Tugay对不起,我不太明白你说的是什么,什么三角形?
    – 信息01
    评论 2017年5月23日19:13
  • 1
    @LinuRadu这个答案可能对您有所帮助:在Hibernate中session.flush()的用途是什么
    – 信息01
    评论 2017年10月5日19:31
19

Resource_Local和JTA是事务管理器(执行事务的方法)。这不是数据库的属性,而是负责协调事务的组件。JPA和JTA事务管理器不同。JPA事务管理器负责JPA事务,如果您只执行JPA事务的话,那么您希望使用一个事务管理器。JTA事务管理器是通用事务管理器,可以在事务中征用JMS队列等其他资源。通常,JavaEE容器为EJB、JPA实体等使用JTA事务管理器。

1

resource_local与JTA是关于本地事务与全局事务的。这是关于我们能否在单个事务下管理多个资源。

CMT与BMT是关于谁在打开和关闭事务——应用程序开发人员还是应用程序服务器。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.