1. Transaction 分兩種,Local Transaction 和 Global Transaction。
涉及到一個Connection的Commit,稱為Local Transaction。
涉及到多個Connection的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接口的實現(xiàn),需要數(shù)據(jù)庫的JDBC提供。
數(shù)據(jù)庫本身要支持XA。數(shù)據(jù)庫的JDBC也要提供XA的實現(xiàn)。
Oracle, Sybase, DB2, SQL Server等大型數(shù)據(jù)庫才支持XA, 支持Global Transaction。
My SQL 連Local Transaction都支持不好,更別說Global Transation了。
3. XA需要兩階段提交 -- prepare 和 commit.
假設(shè)有兩個Connection, con1, con2, 大體的過程如下,
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
}
前面有人講了,在XAResouce1 and 2 commit的時候,
可能XAResouce1 commit() 成功了,XAResouce2 commit()失敗了。
這時候,會拋出一個 “啟發(fā)式異常”。程序可以處理這個異常。比如,XAResouce.recover()之類。
但一般情況下,還真沒別的辦法,需要數(shù)據(jù)管理員根據(jù)數(shù)據(jù)操作日志 undo所有的操作,或者恢復(fù)數(shù)據(jù)備份。
有的數(shù)據(jù)庫在進(jìn)行數(shù)據(jù)操作的時候,會生成一個“反操作”日志。比如,insert 對 delete, 等。
4. TransactionManager的實現(xiàn)能夠處理多個XAResouce(一個XAResouce list)的情況。
比如Tyrex。或JBoss等EJB Server的Transaction實現(xiàn)代碼。
涉及到一個Connection的Commit,稱為Local Transaction。
涉及到多個Connection的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接口的實現(xiàn),需要數(shù)據(jù)庫的JDBC提供。
數(shù)據(jù)庫本身要支持XA。數(shù)據(jù)庫的JDBC也要提供XA的實現(xiàn)。
Oracle, Sybase, DB2, SQL Server等大型數(shù)據(jù)庫才支持XA, 支持Global Transaction。
My SQL 連Local Transaction都支持不好,更別說Global Transation了。
3. XA需要兩階段提交 -- prepare 和 commit.
假設(shè)有兩個Connection, con1, con2, 大體的過程如下,
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
}
前面有人講了,在XAResouce1 and 2 commit的時候,
可能XAResouce1 commit() 成功了,XAResouce2 commit()失敗了。
這時候,會拋出一個 “啟發(fā)式異常”。程序可以處理這個異常。比如,XAResouce.recover()之類。
但一般情況下,還真沒別的辦法,需要數(shù)據(jù)管理員根據(jù)數(shù)據(jù)操作日志 undo所有的操作,或者恢復(fù)數(shù)據(jù)備份。
有的數(shù)據(jù)庫在進(jìn)行數(shù)據(jù)操作的時候,會生成一個“反操作”日志。比如,insert 對 delete, 等。
4. TransactionManager的實現(xiàn)能夠處理多個XAResouce(一個XAResouce list)的情況。
比如Tyrex。或JBoss等EJB Server的Transaction實現(xiàn)代碼。