JTA 和本地事务有啥区别?

Posted

技术标签:

【中文标题】JTA 和本地事务有啥区别?【英文标题】:What is the difference between JTA and a local transaction?JTA 和本地事务有什么区别? 【发布时间】:2012-03-04 05:58:58 【问题描述】:

JTA 和本地事务有什么区别?

显示何时使用 JTA 以及何时使用本地事务的示例会很棒。

【问题讨论】:

【参考方案1】:

JTA 是用于管理 Java 事务的通用 API。它允许您以资源中立的方式启动、提交和回滚事务。事务状态通常存储在 TLS(线程本地存储)中,并且可以传播到调用堆栈中的其他方法,而无需传递一些显式的上下文对象。事务资源可以加入正在进行的事务。如果有多个资源参与此类事务,则其中至少一个必须是所谓的 XA 资源。

resource local transaction 是一个事务,您使用特定的单一资源使用其自己的特定 API。这样的事务通常不会传播到调用堆栈中的其他方法,并且您需要传递一些显式的上下文对象。在大多数资源本地事务中,不可能有多个资源参与同一个事务。

您将在例如 Java SE 中的低级 JDBC 代码中使用资源本地事务。这里上下文对象由java.sql.Connection 的实例表示。资源本地事务的其他例子是开发人员在 2002 年左右创建企业应用程序。由于事务管理器(由 JTA 使用)在那个时代是昂贵的、封闭的源代码和复杂的设置,人们选择了更便宜、更容易获得资源本地变体。

您基本上会在所有其他场景中使用 JTA 事务。非常简单、小型、免费和开源的服务器,如 TomEE (25MB) 或 GlassFish (35MB),具有开箱即用的 JTA 支持。无需设置任何东西,它们就可以工作。

最后,通过提供declarative transactions,EJB 和 Spring 等技术甚至使 JTA 更易于使用。在大多数情况下,建议使用它们,因为它们更容易、更干净且不易出错。 EJB 和 Spring 都可以在后台使用 JTA。

【讨论】:

+1 用于解释 JTA 用途(EJB、Spring 等)的历史和发展。 不明白这里的单线程和调用堆栈到底是什么意思。 JTA 应该用在分布式系统中【参考方案2】:

Java SE 应用程序的事务类型应设置为“RESOURCE_LOCAL”,Java EE 应用程序应设置为“JTA”。 “RESOURCE_LOCAL”可能在某些部署在 Tomcat 上的 Web 应用程序上运行良好,但在 glassfish 环境下运行应用程序时可能会导致问题。

如果您正在处理分布式事务,则必须使用“JTA”作为您的事务管理器。

【讨论】:

【参考方案3】:

Java Transaction API (JTA) 是 Java Enterprise Edition (Java EE) API 之一,允许在 Java 环境中跨多个 XA 资源完成分布式事务。

【讨论】:

【参考方案4】:

J2EE 应用程序通过 2 个规范包括对 DT 的支持 JTA--->Java Transaction API.highe-level 实现并始终启用 JTS--->Java 事务服务。

【讨论】:

以上是关于JTA 和本地事务有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

JTA的使用与理解

Java中的事务——全局事务与本地事务

数据源、XADataSource 和 JTA

Spring 事务相关

java事务

数据库事务模型分析