Dea*_*mer 7 java ejb transactions java-ee
我想知道如何在EJB内部实现事务.我想知道他们用来创建交易的逻辑.如果你能指出一些有用的文章
Hibernate不实现事务,它依赖并包装JDBC事务或JTA事务(容器管理或应用程序管理).
关于EJB的,如果你想了解一个JTA事务管理的细节,你需要能流畅使用JTA接口UserTransaction,TransactionManager以及XAResource它们在描述JTA规范.在JDBC API教程与参考手册(第三版)也将了解JDBC驱动程序的XA部分非常有用.
然后,获取EJB容器(如JBoss)或独立JTA事务管理器(如Atomikos)的源代码来分析TM部分.还有祝你好运.
这个问题可以有多个层面的答案。
我的总结是这样的...首先,某个地方必须有一个事务协调器,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。然而,有一个关键细节:您的事务管理器(通常是应用程序服务器本身)必须能够告诉资源管理器任何给定事务的命运,并且该信息必须在应用程序服务器重新启动后仍然存在,因此需要持久存储事务信息必须保留。您会在某处找到事务日志,在设置应用程序服务器时,您需要确保这些日志得到很好的照顾。
休眠有TransactionFactory:
Transaction 实例的抽象工厂。具体实现由 hibernate.transaction.factory_class 指定。
它有实现:JDBCTransactionFactory、JTATransactionFactory、CMTTransactionFactory。这些工厂创建一个实例Transaction- 例如JDBCTransaction。
然后我无法告诉您 JTA 和 CMT 会发生什么,但对于 JDBC 来说,就像将自动提交设置为 false 一样简单(当您调用开始事务时):
connection.setAutoCommit(false);
Run Code Online (Sandbox Code Playgroud)
并分别在transaction.commit():connection.commit()
如果在会话操作时发生任何异常,它会调用connection.rollback()
| 归档时间: |
|
| 查看次数: |
3774 次 |
| 最近记录: |