JTA与本地交易

时间:2018-10-04 05:12:28

标签: java spring transactions spring-transactions

  1. 本地交易和BMT是否相同?
  2. 本地交易需要使用transactionManager吗?

    我阅读了transactionManager对于本地交易将无效。正确吗?

  3. JTA是否同时提供CMT和BMT?

2 个答案:

答案 0 :(得分:2)

关于BMT或CMT的本地或全局事务处理没有区别。

BMT和CMT仅定义如何定义事务的开始和结束。在CMT中,它是由带注释的方法的调用定义的;在BMT中,交易的开始和结束是使用UserTransaction-object定义的。

如果需要进行全局交易,或者更好的是进行分布式交易,那么Transactionmanager将独立于BMT或CMT进行安排。

一旦涉及一个以上的交易资源,就必须进行这些全局交易或两阶段提交。例如,如果您使用MessageDriven bean,它调用一个标注为“ Bean管理的事务处理”的bean,并在DBMS中进行更改。在这种情况下,将对消息队列和DBMS的资源进行两阶段提交。

因此,回答您的问题:

  1. 不,请参见上面的答案。
  2. 没有transactionmanager,您不能使用一种以上的资源进行事务。提供J2EE容器通常提供的分布式事务的容器将使用Transactionmanager处理所有事务。在jboss上,您可以将数据源配置为“ no jta”,在这种情况下,您可以明确地将其从两阶段提交中排除,但是我认为jboss-transactionmanager仍将处理此类数据源的db-connections。
  3. 是的,如果“提供”是指“支持”

答案 1 :(得分:0)

以下是针对您的问题的几点说明。

  1. 全局事务支持可用于Web和企业bean J2EE组件,并且在某些限制下可用于应用程序客户端。 组件。

    企业bean组件可以分为两类:使用容器管理的事务( CMT )的bean, 以及使用bean管理的交易的交易( BMT )。

    local transaction containment (LTC)用于定义 应用程序服务器在未指定事务上下文中的行为。 LTC是有界的工作单元范围,在该范围内,零,一或 可以访问更多的资源管理器本地事务(RMLT)。的 LTC定义了必须完成所有RMLT的边界;任何 根据政策,不完整的RMLT由解决 容器。 LTC对于bean实例是本地的;不共享 跨bean,即使这些bean由同一容器管理也是如此。 LTC由容器启动,然后在其上分派方法 J2EE组件(例如企业Bean或Servlet)每当 调度是在没有全局事务上下文的情况下发生的。 LTC 由容器完成,具体取决于 应用程序配置的LTC边界,例如,在 方法分派。 LTC没有编程接口 支持; LTC由容器专门管理,并且 由应用程序部署者通过事务配置 应用程序部署描述符中的属性。

    本地交易包含不能与 全球交易。如果在 如果没有全球交易,则容器始终会建立一个 J2EE 1.3或更高版本的J2EE组件的LTC。

  2. 如果应用程序使用两个或更多资源,则需要外部事务管理器来协调对全局事务中所有资源管理器的更新。

    了解更多信息。在交易经理上:https://access.redhat.com/documentation/en-US/Fuse_ESB_Enterprise/7.1/html/EIP_Transaction_Guide/files/TxnManagers-WhatIs.html

  3. BMT企业bean,应用程序客户端组件和Web组件可以使用Java事务API(JTA)UserTransaction 定义全局事务划分的接口。至 获取UserTransaction接口,使用Java命名和 java:comp / UserTransaction的目录接口(JNDI)查找,或者 使用SessionContext对象中的getUserTransaction方法。

    CMT 企业无法使用UserTransaction界面 如果CMT企业bean尝试获取此接口,则 根据Enterprise JavaBeans抛出异常 (EJB)规范。

    Web组件或企业bean( CMT或BMT )可以获取 ExtendedJTATransaction界面,通过 java:comp/websphere/ExtendedJTATransaction。这个介面 提供对交易身份的访问以及一种机制 接收交易完成的通知。