在部落格上看到“系統設計應關注並發性 ”文章中提到的有關分布式異構資料庫的交易處理,好象大家都沒有辦法。
就像大家都知道的,在一個事務Commit後,這個事務再進行Roolback已經是無效的了。
那麼我們可以在事務未Cmmit之前就可以Catch到Exception的。
比如:目前有兩個Connection :一個為本地SQL 資料庫的Connection,叫LocalConnection,另一個是伺服器上的Oracle的Connection叫OracleConnection。
當前LocalConnection上有兩個操作,OracleConnection上也有兩個操作,我們先把兩個事務Open()
try
{
.
LocalCommand.ExecuteNonQuery() //LocalCommand為LocalConnection的一個Command
LocalCommand2.ExecuteNonQuery() //LocalCommand2為LocalConnection的一個Command
..
OracleCommand.ExecuteNonQuery() //OracleCommand為OracleConnection的一個Command
OracleCommand2.ExecuteNonQuery() //OracleCommand2為OracleConnection的一個Command
LocalConnection.Commit();
OracleConnection.Commit(); //兩個事務提交
}catch
{
LocalConnection.Roolback();
OracleConnection.Roolback(); //兩個交易回復
}final
{
LocalConnection.Close();
OracleConnection.Close(); //兩個串連Close()
}
這樣的話,如果有異常的話,兩個事務都不會提交的。
不知道這樣的方式,存不存在不正確的,歡迎大家討論。
我在SPL中用這個這種方式實現的,測試也通過了。