pdf / 2-JDBC
.pdfПереиспользование PreparedStatement
ConnectionPoolDataSource
Distributed Transactions
●Distributed transaction infrastructure
●Transaction managers and resource managers
●The XADataSource, XAConnection, and XAResource interfaces
●Two-phase commit
public interface XAConnection extends PooledConnection
{
javax.transaction.xa.XAResource getXAResource() throws SQLException;
}
public interface XADataSource
{
XAConnection getXAConnection() throws SQLException; XAConnection getXAConnection(String user,
String password) throws SQLException;
………….
}
XAResource контракт между Resource Manager и Transaction Manager
Two-phase Commit
1. The application server gets XAResource objects from two different connections:
//XAConA connects to resource manager A javax.transaction.xa.XAResource resourceA = XAConA.getXAResource();
//XAConB connects to resource manager B javax.transaction.xa.XAResource resourceB = XAConB.getXAResource();
2.Сервер передает resourceA, resourceB в менеджер транзакций
3.МТ создает транзакцию (xid) и связывает с ней resourceA, resourceB
// Send work to resource manager A. The TMNOFLAGS argument indicates // we are starting a new branch of the transaction, not joining or
// resuming an existing branch.
resourceA.start(xid, javax.transaction.xa.TMNOFLAGS);
//do work with resource manager A
...
//tell resource manager A that it’s done, and no errors have occurred resourceA.end(xid, javax.transaction.xa.TMSUCCESS);
// do work with resource manager B.
resourceB.start(xid, javax.transaction.xa.TMNOFLAGS);
// B’s part of the distributed transaction
...
resourceB.end(xid, javax.transaction.xa.TMSUCCESS);
4. ТМ начинает two-phase commit
//A participating resource manager can vote to roll back the transaction by //throwing a javax.transaction.xa.XAException.
resourceA.prepare(xid);
resourceB.prepare(xid);
5. ТМ осуществляет commit or rollback
//the second parameter tells the resource manager not to use //a one phase commit protocol on behalf of the xid resourceA.commit(xid, false);
resourceB.commit(xid, false);