97

我有以下疑问:

  1. 这两者有什么区别?
  2. 所有数据库都支持这两者吗?
  3. JPA TransactionManager 和 JTA TransactionManager 有区别吗?
4

4 回答 4

104

JPA 实现可以选择自己管理事务 ( RESOURCE_LOCAL),或者让它们由应用服务器的 JTA 实现来管理。

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

JTA 还用于管理 JMS 和 JCA 等系统之间的事务,但这对我们大多数人来说是相当陌生的用法。

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

于 2009-12-26T09:47:52.637 回答
94

作为其他答案的补充

这是一篇非常有用的文章(发表在Apache TomEE网站上)的摘录,它也可以帮助回答 OP 的第一个问题(文章的链接在下面)。


比较 RESOURCE_LOCAL 和 JTA 持久性上下文


使用<persistence-unit transaction-type="RESOURCE_LOCAL"> 负责 EntityManager (PersistenceContext/Cache) 创建和跟踪...

  • 必须使用 EntityManagerFactory来获取 EntityManager
  • 生成的EntityManager实例 PersistenceContext/Cache
  • EntityManagerFactory只能通过 @PersistenceUnit注解注入 (不是@PersistenceContext)
  • 不允许使用@PersistenceContext 来引用 RESOURCE_LOCAL 类型的单元
  • 必须使用 EntityTransaction API 来开始/提交对 EntityManger 的 每次调用
  • 调用 entityManagerFactory.createEntityManager() 两次会产生 两个单独的 EntityManager 实例,因此会 产生两个单独的 PersistenceContexts/Caches。
  • 使用多个 EntityManager实例几乎从来都不是一个好主意(除非您已销毁第一个,否则不要创建第二个)


使用<persistence-unit transaction-type="JTA">容器将 执行 EntityManager (PersistenceContext/Cache) 创建和跟踪...

  • 不能使用 EntityManagerFactory来获取 EntityManager
  • 您只能获取容器提供 的EntityManager
  • EntityManager只能通过@PersistenceContext注解 注入 (不是@PersistenceUnit)
  • 不允许 使用@PersistenceUnit 来引用 JTA 类型的单元
  • 容器给出的EntityManager是对与 JTA 事务关联的 PersistenceContext/Cache的引用。
  • 如果没有正在进行的 JTA 事务, 则无法使用EntityManager,因为没有 PersistenceContext/Cache。
  • 每个在同一事务中使用 EntityManager 引用同一单元的人将自动拥有对 同一 PersistenceContext/Cache的引用
  • PersistenceContext/Cache在 JTA提交时被刷新和清除

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

于 2015-03-11T21:52:58.440 回答
19

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

于 2009-12-26T03:17:49.860 回答
1

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

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

于 2019-02-09T16:43:56.200 回答