Допустим, у меня есть такой код:
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,...);
Итак, вызывает ли userTransaction.begin () JTA xaResource.start (xid) для всего управляемого DataSource?
Или как он реализует этот механизм?