java - 企业级应用程序中的事务

标签 java spring jdbc jta

我正在尝试理解事务,更具体地说,我正在使用 Spring 框架来完成它。浏览我拥有的 Material (互联网和书籍),我看到这些术语:

  1. 容器管理事务 (CMT)。
  2. Bean 管理事务 (BMT)。
  3. Java 事务 API (JTA)。

此外,对于大型企业级应用程序,我也遇到过“本地”和“全局”事务等术语。

我所理解的是,全局事务适用于我们管理两个或多个不同资源(例如一个 Oracle DB、其他 MySQL 等)的情况,并且如果两者都成功/失败,则会发生提交/回滚。本地事务适用于我们只有一种资源需要管理的情况(例如只有一个到 MySQL 的数据库连接)。

我有以下疑问:

  1. 在编写简单的 JDBC 独立程序时,我们可以编写代码来提交/回滚。我相信这是本地交易的示例,这是正确的吗?这个事务是由“JDBC”库本身还是驱动程序负责的?

  2. 什么是 CMT?我的理解是容器负责事务管理(如Jboss AS)。如果这是正确的,它的内部是如何管理的? CMT 是本地的还是全局的?他们在内部使用 JDBC API 来管理事务吗?

  3. 什么是 BMT?这我无法理解。我们可以将应用程序部署在应用程序服务器中(我相信在这些情况下事务将由容器管理),或者我可以编写一个独立的应用程序,在其中我可以自己使用事务管理代码(尝试.. catch block 等)。那么,BMT 属于哪一类?

  4. 在阅读 Spring 框架时,我了解到 Spring 框架有自己的管理事务的方式。下来,我读到 Spring Framework 使用 JTA 来管理事务?我对此很困惑。如果 JTA 是 API,我们是否有多个供应商实现 JTA(就像 JPA 一样,我们可以有多个供应商提供实现,例如 Hibernate)。

  5. JTA 是用于本地事务还是全局事务?当我编写一个简单的 JDBC 程序来管理事务时,它是否使用符合 JTA 的 API?或者JTA与简单的JDBC程序使用的事务管理完全不同?

  6. CMT 也是如此,CMT 是否遵循 JTA 制定的规则(主要是 API)?

如果你能逐点回答就太好了,我在网上搜索过,我的疑问仍然没有得到解答。

最佳答案

关于本地/全局事务:通过全局,我想您正在谈论 XA 事务(2 阶段提交: http://en.wikipedia.org/wiki/X/Open_XA )。当您处理多个数据库或事务性资源时,这是强制性的。

  1. 是的,这是一个“本地事务”,这意味着只有一个数据库是 交易的一部分。事务由数据库管理 在这种情况下由 JDBC 控制。

  2. CMT:容器管理:容器将检测启动并 事务结束并将执行提交/回滚 取决于方法返回状态(成功返回:提交, 异常(exception):回滚)。 CMT 依靠 JTA 来管理其上的交易 资源。然后由适当的资源适配器 (RA) 进行对话 jdbc 或与您的 EIS(数据)相关的任何其他驱动程序。看着 http://docs.oracle.com/javaee/5/tutorial/doc/bncjx.html

  3. BMT:这意味着由bean来控制事务 边界。这种交易方式很少见 这些天的管理。通过 BMT,您可以控制 UserTransaction 对象,直接控制事务边界是错误的 使用 JDBC。还要记住,即使您参加了 BMT 像 JPA(不是 JTA)这样的框架将使当前事务无效 即使您没有明确请求回滚,也会出现任何错误。它 意味着使用 BMT 非常困难/危险/无用。

  4. JTA(我希望你没有拼错JPA)处于另一个层面:JTA 资源适配器必须实现的 API 才能成为容器的一部分 交易。除了 UserTransaction 类(您将在 BMT控制交易边界)与你无关 JTA。 JTA 没有多种实现,但 JTS(Java Transaction Service)有多种实现,每个应用服务器供应商都实现自己的 JTS。

  5. JTA是框架设计者的API,JTA向框架强加了一个契约 资源适配器 RA,RA 将使用 JDBC 或任何其他 API 来 处理它的EIS(企业信息存储,我们称之为 你的数据库)。 JTA 适用于 XA 和非 XA 事务(如果您的 RA 支持 XA 事务)。

  6. CMT 使用 JTA,但同样,JTA 是 应用程序服务器的组件。应用程序设计者应该 不关心JTA。

关于java - 企业级应用程序中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26503286/

相关文章:

java - Spring Boot获取浏览器请求URL

spring - ThymeLeaf - 将表数据(ArrayList)发布到另一个 Controller

java 和 sql 到 JList

java - 如今,使用 JDBC 的连接池是否仍在提高性能?

java求二维方形网格的总和

java - 等同于 Arrays.asList() 但对于数组?

java - Hibernate 对 Select 执行删除

java - @Transactional 如何影响 Hibernate 中的当前 session ?

java - 如何确定 SQL 语句中列名是否必须用引号引用?

java机器人转弯不足转向