我试图环绕我的头值在Java事务API(JTA)及其实现,Bitronix之一的下方。但是随着我对文档的深入研究,我不禁想到以下简单示例:
public interface Transactional {
public void commit(Object);
public void rollback();
}
public class TransactionalFileWriter extends FileWriter implements Transactional {
@Override
public void commit(Object obj) {
String str = (String)obj;
// Write the String to a file.
write(str);
}
@Override
public void rollback() {
// Obtain a handler to the File we are writing to, and delete the file.
// This returns the file system to the state it was in before we created a file and started writing to it.
File f = getFile();
// This is just pseudo-code for the sake of this example.
File.delete(f);
}
}
// Some method in a class somewhere...
public void doSomething(File someFile) {
TransactionalFileWriter txFileWriter = getTxFW(someFile);
try {
txFileWriter.commit("Create the file and write this message to it.");
} catch(Throwable t) {
txFileWriter.rollback();
}
}
不要太被上面的实际代码所困扰。这个想法很简单:创建文件并写入文件的事务性文件编写器。它的rollback()
方法删除文件,从而使文件系统返回到之前的状态commit(Object)
。
我在这里想念什么吗?这是JTA提供的全部吗?还是在上面的简单示例中没有表现出一套完整的关于交易性的维度/方面?我猜是后者,但尚未在JTA文档中看到任何具体的内容。如果我缺少某些东西,那是什么,有人可以给我看一些具体的例子吗?我可以看到事务性是JDBC的重要组成部分,但希望希望能得到一个JTA实例与数据库以外的实例。
JTA的最大功能是,您可以在一个应用程序中组成多个事务存储,并运行跨这些独立存储的事务。
例如,您可以拥有一个数据库,一个分布式事务性键值存储和简单的FileWriter,并具有一个对所有这些操作执行操作并一次提交所有存储中的所有更改的事务。
看看infinispan。那是一个事务数据网格,它使用JTA,并且可以与其他JTA事务服务结合使用。
编辑:
基本上,JTA连接到X / Open XA标准,并且它提供了直接用Java代码与X / Open XA资源进行交互的方法。您可以使用现有的旧数据存储区,这些数据存储区包含X / Open XA兼容资源,例如数据库,分布式数据网格等。或者,您可以通过实现javax.transaction.xa.XAResource定义自己的资源。然后,当您的用户事务使用这些资源时,事务管理器将为您编排所有内容,无论这些资源位于何处,位于哪个数据存储中。
整个业务由事务管理器管理,该事务管理器负责同步独立的数据存储。JTA不附带事务管理器。JTA只是一个API。如果愿意,可以编写自己的代码(javax.transaction.TransactionManager),但这显然是一项艰巨的任务。相反,您想要的是使用一些已经实现的具有事务管理器的JTA服务/库。例如,如果您在应用程序中使用infinispan,则可以使用其事务管理器来允许您的事务与不同的数据存储进行交互。最好向JTA接口的实现者寻求有关如何实现此目标的更多信息。
您可以在这里找到完整的JTA API文档,尽管它很长。还有一些可用的教程,讨论如何使用Java EE事务管理器和更新多个数据存储,但是这很晦涩,不提供任何代码示例。
您可以查看Infinispan的文档和教程,尽管我看不到任何将Infinispan与其他数据存储相结合的示例。
编辑2:
从评论中回答您的问题:您的理解或多或少是正确的,但我将尝试进一步阐明。
解释架构并用图片回答您的问题会更容易。以下摘自JTA规范1.1
这是X / Open XA架构:
每个数据存储区(数据库,消息队列,SAP ERP系统等)都有其自己的资源管理器。对于关系数据库,JDBC驱动程序是一个资源适配器,代表Java中数据库的资源管理器。每个资源都必须通过XAResource接口可用(这样,即使不知道特定数据存储的实现细节,事务管理器也可以管理它们)。
您的应用程序通过资源适配器与资源管理器(以获取对特定资源的访问)进行通信,并通过UserTransaction接口与事务管理器(以启动/完成事务)进行通信。每个资源管理器都需要首先进行初始化,并且必须针对全局事务进行配置(即,跨越多个数据存储)。
因此,基本上,是的,数据存储区是对某些资源进行分组的独立逻辑单元。它们还展示了允许执行本地事务的界面(仅限于该特定数据存储)。该接口的性能可能更好,或者可能会公开一些特定于该数据存储的其他功能,而这些功能无法通过JTA接口使用。
这是JTA环境的体系结构:
小半圆代表JTA接口。在您的情况下,您最感兴趣的是JTA UserTransaction界面。您还可以使用EJB(事务Bean),Application Server将为您管理事务,但这是另一种方式。
从事务管理器的角度来看,不需要公开事务服务的实际实现。仅需要定义高级接口,以允许从事务服务的用户驱动事务划分,资源征用,同步和恢复过程。
因此,事务管理器可以理解为仅代表用于管理事务(例如JTS实现)的实际机制的接口,但将其作为一个整体来考虑也不是一个错误。
据我了解,例如,如果您运行JBoss应用程序服务器,则您已经配备了带有基本事务服务实现的事务管理器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句