JTAにおけるデータベース間プロビジョニングの実現原理---簡単な理解


私は自分の経験に基づいて個人的な見方を話します.これは非常に複雑な話題です.二言三言ははっきり言えないかもしれない.
1.Transactionは2種類あり、Local TransactionとGlobal Transactionです.
接続に関するCommitは、Local Transactionと呼ばれます.
複数の接続に関わるCommitをGlobal Transactionと呼びます.
スレ主が言ったのは、Global Transactionです.
2.Global Transactionでは、XAインタフェース(JTAに含まれる)のサポートが必要です.
import javax.sql.XAConnection;
import javax.transaction.xa.Xid;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.XAException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
その中の
javax.sql.XAConnection;
javax.transaction.xa.Xid;
javax.transaction.xa.XAResource;
これらのXAインタフェースの実装には、データベースのJDBC提供が必要です.
データベース自体はXAをサポートします.データベースのJDBCもXAの実装を提供します.
Oracle、Sybase、DB 2、SQL Serverなどの大規模なデータベースはXAをサポートし、Global Transactionをサポートします.
My SQLはLocal Transactionもサポートできないし、Global Transationは言うまでもない.
3.XAは2段階の提出を必要とする--prepareとcommit.
2つのConnection,con 1,con 2があると仮定すると,大体の過程は以下の通りである.
con1 = XAResouce1.getConnection...
con2 = XAResouce2.getConnection...

con1 do some thing.
con2 do some thing.
after they finish.

pre1 = XAResouce1.prepare();
pre2 = XAResouce2.prepare();

if( both pre1 and pre2 are OK){
XAResouce1 and 2 commit
}else {
XAResouce1 and 2 rollback
}

前に誰かが話していましたが、XAResouce 1 and 2 commitの時、
XAResouce 1 commit()が成功したのか、XAResouce 2 commit()が失敗した.
このとき、「啓発的な異常」が投げ出されます.プログラムはこの異常を処理することができる.例えば、XAResouce.recover()など.
しかし、一般的には、データ管理者がデータ操作ログundoのすべての操作に従ったり、データバックアップをリカバリしたりする必要はありません.
データベースによっては、データ操作時に「逆操作」ログが生成される場合があります.例えば、insert対deleteなどです.
4.TransactionManagerの実装は、複数のXAResouce(1つのXAResouce list)の場合を処理することができる.
例えばTyrex.またはJBossなどのEJB ServerのTransaction実装コード