我有疑问如下:
JPA实现有管理交易本身(RESOURCE_LOCAL
),或让他们通过应用程序服务器的JTA实现管理的选择。
在大多数情况下,RESOURCE_LOCAL是罚款。这将使用基本的JDBC级交易。不足之处是该交易是本地JPA持久性单元,所以如果你想跨越多个持久化单元(或其他数据库)交易,那么可能RESOURCE_LOCAL是不够好。
JTA也用于遇到像JMS和JCA系统管理事务,但是这对于我们大多数人相当奇特的用法。
要使用JTA,你需要支持它在你的应用服务器,还从JDBC驱动程序支持。
作为除其他答案
下面是从非常有用的文章(在Apache TomEE网站上公布),这也可以帮助回答OP的第一个问题(链接到文章正下方)的摘录。
Comparing RESOURCE_LOCAL and JTA persistence contexts
与<持久单元交易类型=“RESOURCE_LOCAL”>您正在负责的EntityManager(PersistenceContext /高速缓存)创建和跟踪...
- 您必须使用EntityManagerFactory的获得一个EntityManager
- 将所得EntityManager实例是PersistenceContext /高速缓存
- EntityManagerFactory的可通过@PersistenceUnit注解仅注射(未@PersistenceContext)
- 您不允许使用@PersistenceContext引用类型RESOURCE_LOCAL单位
- 您必须使用EntityTransaction API开始/每次调用提交同意你的EntityManager
- 调用entityManagerFactory.createEntityManager()两次结果在两个分开的EntityManager实例,并且因此两个单独的持久化上下文/缓存。
- 这是几乎从来没有在使用中有一个EntityManager的多个实例是一个好主意(不创建第二个,除非你已经破坏了第一)
与<持久单元交易类型=“JTA”>容器将做的EntityManager(PersistenceContext /高速缓存)创建和跟踪...
- 不能使用EntityManagerFactory的获得一个EntityManager
- 你只能得到由容器提供一个EntityManager
- 一个EntityManager可以通过@PersistenceContext注解仅注射(未@PersistenceUnit)
- 您不允许使用@PersistenceUnit引用类型JTA单位
- 由容器给出的EntityManager的是为与JTA事务相关联的PersistenceContext /高速缓存的参考。
- 如果没有JTA事务正在进行中,EntityManager的不能用,因为没有PersistenceContext /缓存。
- 大家都用一个EntityManager参照同一单元在同一事务将自动具有到相同PersistenceContext /高速缓存的参考
- 该PersistenceContext / Cache被冲洗,并在JTA清除提交时间
任何有兴趣学习Java持久性API - 请在这里请你帮个忙,并阅读全文:JPA Concepts: JPA 101。
RESOURCE_LOCAL和JTA的事务管理器(在做交易的方法)。这不是数据库的属性,但该组件负责协调事务。 JPA和JTA事务管理器是不同的。 JPA事务管理器负责JPA交易,你想用一个,如果你只是做JPA事务。 JTA事务管理器是通用的事务管理器和可以借助其他资源,如在交易JMS队列。典型的Java EE容器使用为EJB,JPA实体等一个JTA事务管理器
RESOURCE_LOCAL VS JTA其对本地交易VS全局事务。这是关于我们可以下单成交管理多个资源。
CMT VS BMT其有关谁在打开和关闭交易 - 应用开发者或应用程序服务器。