首页 > 解决方案 > 具有多个数据库服务器的分布式事务似乎不可靠

问题描述

在谷歌搜索了几天后,我了解了一些关于 JTA 和

然后编写了一个应用程序,它使用 JTA、JDBC 和 MySQL 服务器来执行分布式事务。下面是我的代码。

我们使用 3 个不同的数据库服务器, res1、res2 和 res3(它们是 3 个不同的 XAResources)分别表示它们。

try{
    res1.start(xid1, XAResource.TMNOFLAGS);
    dao.addEmployee(e, con);
    res1.end(xid1, XAResource.TMSUCCESS);

    res2.start(xid2, XAResource.TMNOFLAGS);
    dao.addDepartment(d, tournamentCon);
    res2.end(xid2, XAResource.TMSUCCESS);
    res3.start(xid3, XAResource.TMNOFLAGS);
    dao.addAsset(a, testCon);
    res3.end(xid3, XAResource.TMSUCCESS);
    int result1 = res1.prepare(xid1);
    int result2 = res2.prepare(xid2);
    int result3 = res3.prepare(xid3);

    if(result1 == XAResource.XA_OK && result2 == XAResource.XA_OK && 
    result3 == XAResource.XA_OK) {
    res1.commit(xid1, false);
    res2.commit(xid2, false);
        res3.commit(xid3, false);
    }
}
catch(Exception e){
    res1.rollback(xid1);
    res2.rollback(xid2);
    res3.rollback(xid3);
}

现在,这种方法的问题是:-

假设在 res2.commit 或 res3.commit 期间,有一个异常然后已经完成的提交,即 res1.commit,不能回滚

但我们希望所有这些 trxs 完全完成或根本不完成。

有人可以让我知道该怎么做吗?

仅供参考:我们没有使用任何应用程序服务器。

还请让我知道什么是事务管理器?它是需要明确使用的 as/w 组件还是我发布的代码是所谓的事务管理器。

任何帮助将不胜感激。

标签: javamysqljdbcjtadistributed-transactions

解决方案


推荐阅读