如何在EJB中实现Transaction概念

Dea*_*mer 7 java ejb transactions java-ee

我想知道如何在EJB内部实现事务.我想知道他们用来创建交易的逻辑.如果你能指出一些有用的文章

Pas*_*ent 8

Hibernate不实现事务,它依赖并包装JDBC事务或JTA事务(容器管理或应用程序管理).

关于EJB的,如果你想了解一个JTA事务管理的细节,你需要能流畅使用JTA接口UserTransaction,TransactionManager以及XAResource它们在描述JTA规范.在JDBC API教程与参考手册(第三版)也将了解JDBC驱动程序的XA部分非常有用.

然后,获取EJB容器(如JBoss)或独立JTA事务管理器(如Atomikos)的源代码来分析TM部分.还有祝你好运.


djn*_*jna 5

这个问题可以有多个层面的答案。

关于正在发生的事情的一般讨论可以在这里找到

我的总结是这样的...首先,某个地方必须有一个事务协调器,EJB 容器将了解该协调器 - 通常它是应用程序服务器的一部分。所以 EJB 容器所要做的就是调用

someobject.BeginTransaction()
Run Code Online (Sandbox Code Playgroud)

就是这样。EJB 容器使用的实际 API 是JTA。EJB实际上可以使用Bean管理的事务或容器管理的事务。在 Bean 管理的情况下,实现者必须进行 JTA 调用。更常见的是,我们使用容器管理事务(CMT)。在这种情况下,容器具有在实现之前运行的逻辑。例如:

if ( we're not already in a transaction )
    begin transaction

call the EJB implementation
Run Code Online (Sandbox Code Playgroud)

然后容器就有了逻辑

if ( finished processing request )
    commit transaction
Run Code Online (Sandbox Code Playgroud)

如果发生错误,可以使用其他路径来中止事务。

现在,逻辑变得更加复杂,因为 CMT EJB 使用事务控制语句进行注释。例如,您可以说“如果我们已经有一个事务,请使用它”。因此,如果一个 EJB 调用另一个 EJB,则仅使用一个事务。请阅读 EJB 规范。

然而,所有这些在 Java EE EJB 的任何文章中都是非常明显的。因此,我怀疑您是在询问 moe 有关JTA 调用内部发生的情况、事务管理器的实现方式及其与事务资源管理器(例如数据库)的关系。这是一个很大的话题。实际上,您已经实现了XA分布式事务协议。坦白说,我怀疑你是否真的需要知道这一点。在某些时候,您会信任您正在使用的 API。然而,有一个关键细节:您的事务管理器(通常是应用程序服务器本身)必须能够告诉资源管理器任何给定事务的命运,并且该信息必须在应用程序服务器重新启动后仍然存在,因此需要持久存储事务信息必须保留。您会在某处找到事务日志,在设置应用程序服务器时,您需要确保这些日志得到很好的照顾。


Boz*_*zho 0

休眠有TransactionFactory

Transaction 实例的抽象工厂。具体实现由 hibernate.transaction.factory_class 指定。

它有实现:JDBCTransactionFactoryJTATransactionFactoryCMTTransactionFactory。这些工厂创建一个实例Transaction- 例如JDBCTransaction

然后我无法告诉您 JTA 和 CMT 会发生什么,但对于 JDBC 来说,就像将自动提交设置为 false 一样简单(当您调用开始事务时):

connection.setAutoCommit(false);
Run Code Online (Sandbox Code Playgroud)

并分别在transaction.commit()connection.commit()

如果在会话操作时发生任何异常,它会调用connection.rollback()