31

任何人都可以解释有什么区别:

@Resource
UserTransaction objUserTransaction;

EntityManager.getTransaction();

还有什么是容器管理事务?如果我想在事务的表中插入三行,我应该如何在我的会话外观中执行此操作。

4

3 回答 3

30

EJB 是事务性组件。事务可以由应用服务器本身管理(CMT - 容器管理事务),也可以由您自己在 EJB 中手动管理(BMT - bean 管理事务)。

EJB 通过 JTA 规范支持分布式事务。分布式事务是使用 控制的UserTransaction,它有方法begin, commit, rollback.

使用 CMT,应用程序服务器为您启动、提交和回滚事务(根据事务注释),您不得干预。UserTransaction这意味着在这种情况下您不能访问。但是,使用 BMT,您可以手动执行此操作,并使用UserTransaction.

现在让我们转到EntityManager. JPA 实现既可以在应用程序服务器中使用,也可以独立使用。如果单机使用,需要自己使用EntityManage.getTransaction来划定JDBC事务。如果在应用服务器中使用,则EntityManager与 JTA 分布式事务管理器透明地为您合作。

大多数时候,您@Required在 EJB 上使用带有注释的 CMT。这意味着您不需要访问既UserTransaction也不访问EntityManager.getTransaction。该应用程序。服务器启动并提交事务,但如果引发异常,也会注意回滚。这就是我为你的门面推荐的。

(还有更多的微妙之处,例如PersistenceContextType实体管理器在分布式事务中的手动登记EntityManager.joinTransaction,但前提是您以不同的方式使用这些技术作为默认值)。

于 2010-03-25T17:04:07.800 回答
8

UserTransactionJTA事务实体。只有当应用程序服务器中有可用的 JTA 模块时,您才能使用它:例如,如果您在 Tomcat 上使用此模块部署应用程序(默认情况下不支持 JTA),依赖此模块的代码将失败. 这是 EJB 和 MDB 中使用的默认事务类型。

EntityManager.getTransaction()检索本地事务实体。这有时也称为资源本地事务。

资源本地事务与 JTA 事务有很大不同:除其他外,资源本地事务特定于资源,而 JTA 事务往往特定于特定线程。

有关资源本地事务和 JTA 事务之间区别的更多信息,请在此处查看此 stackoverflow 答案:JTA 和本地事务之间有什么区别?

于 2013-10-25T15:19:31.383 回答
0

除了@Marco 的回答,它很好地说明了 JTA 和资源本地事务之间的区别。

Container Managed Transactions [顾名思义] 由容器而不是您的应用程序管理。这是通过 EJB 层完成的,您只需要编写您的方法,容器将围绕事务上下文包装该方法,因此如果您的方法的任何部分或其较低级别的调用抛出异常,事务将回滚。

它也可以使用注释进行微调。更多信息可以在这里找到https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html

请注意,这只能通过 EJB 完成,并且注入到 Web 层(例如 servlet 或 REST API)的实体管理器不会由容器管理,在这种情况下,您必须使用or 和@Resource UserTransactionEntityManager.getTransaction自己来查找事务。begin()commit()

从 Java EE 6 开始,您可以在 Web 层中使用 EJB,因此您不需要过于复杂的项目布局,除非您开始希望将 EJB 公开为 Web 服务。

于 2014-11-22T12:52:11.430 回答