【发布时间】:2020-07-14 07:41:12
【问题描述】:
假设我有这样的代码:
public class Test{
DataSource ds1;
DataSource ds2;
DataSource ds3;
UserTransaction userTransaction;
...
public void test(){
userTransaction.begin();
ds1.getConnection().createStatement().execute(...);
ds2.getConnection().createStatement().execute(...);
userTransaction.commit();
}
}
UserTransaction 如何知道我将使用哪个 DataSource?
因为它之前没有将 DataSource 注册到 UserTransaction。
在我看来,JTA 是基于 XA 事务的。像这样工作:
XADataSource xaDataSource1;
XADataSource xaDataSource2;
XAResource xaResource1 = xaDataSource1.getXAResource();
XAResource xaResource2 = xaDataSource2.getXAResource();
Xid xid = ...
xaResource1.start(xid);
xaResource2.start(xid);
xaDataSource1.getXAConnection().getConnection().createStatement().execute(...);
xaDataSource2.getXAConnection().getConnection().createStatement().execute(...);
xaResource1.commit(xid,...);
xaResource2.commit(xid,...);
那么,JTA 的 userTransaction.begin() 是否为其所有托管的 DataSource 调用 xaResource.start(xid)?
或者说它是如何实现这个机制的?
【问题讨论】:
标签: java transactions distribution jta