我有以下查询:
- 这两者有什么区别?
- 所有数据库都支持这两种方法吗?
- JPA TransactionManager和JTA TransactionManager是否不同?
Answers:
JPA实现可以选择自己管理事务(RESOURCE_LOCAL
),还是由应用程序服务器的JTA实现管理事务。
在大多数情况下,RESOURCE_LOCAL是可以的。这将使用基本的JDBC级事务。缺点是该事务对于JPA持久性单元而言是本地的,因此,如果您想要一个跨多个持久性单元(或其他数据库)的事务,则RESOURCE_LOCAL可能不够好。
JTA还用于跨JMS和JCA之类的系统管理事务,但这对我们大多数人来说是相当奇特的用法。
要使用JTA,您需要在应用程序服务器中对其进行支持,并且还需要JDBC驱动程序的支持。
作为其他答案的补充
这是一篇非常有用的文章(在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 /高速缓存
- 在JTA提交时刷新并清除PersistenceContext / Cache
有兴趣学习Java Persistence API的任何人-请帮个忙,并在此处阅读完整的文章:JPA概念:JPA 101。
transaction-type=RESOURCE_LOCAL
,并@PersistenceContext
与@Transactional
由Spring管理
Resource_Local和JTA是事务管理器(执行事务的方法)。这不是数据库的属性,而是负责协调事务的组件。JPA和JTA事务管理器是不同的。JPA事务管理器负责JPA事务,如果仅执行JPA事务,则要使用一个。JTA事务管理器是通用事务管理器,可以在事务中注册其他资源,例如JMS队列。通常,Java EE容器为EJB,JPA实体等使用JTA事务管理器。
resource_local与JTA有关本地事务与全局事务。我们可以在一次交易中管理多个资源。
CMT与BMT的关系是谁在打开和关闭交易-应用程序开发人员或应用程序服务器。