none
C# Transaction 機制針對兩個資料庫的寫法建議 RRS feed

  • 問題

  • 大家好:

    目前是要針對兩個資料庫做 Transaction,而以下是我寫的程式LOGIC,

    是用同一個Transaction 物件 好呢?還是 拆不同 的Transaction 物件?

    以下是程式邏輯:

     

     OracleConnection con1 = new OracleConnection(Connectionstring1);
     OracleConnection con2= new OracleConnection(ConnectionString2);
    
    con1.open();
    con2.open();
    
    
    foreach(針對每一筆資料)
    {
    CommittableTransaction ta = new CommittableTransaction();
    con1.EnlistTransaction(ta);
    con2.EnlistTransaction(ta);
    
    ...
    (執行con1,con2下的command相關資料)
    ....
    
    if(isSUCCESS)
    {
     ta.Commit();
    }
    else
    {
     ta.Rollback();
    }
    }//end foreach
    
    

     

    Q1:針對兩個Connection有必要建兩個CommittableTransaction嗎?還是一個CommittableTransaction就可以?是否有什麼Issue??

     

    CommittableTransaction ta = new CommittableTransaction();
    CommittableTransaction ta2 = new CommittableTransaction();
    con1.EnlistTransaction(ta);
    con2.EnlistTransaction(ta2);
    ...
    
    if(isSUCCESS)
    {
     ta.Commit();
     ta2.Commit();
    }
    else
    {
     ta.Rollback();
     ta2.Rollback();
    }
    

     

    上述Q1是因為有碰到此Exception,所以"懷疑"是否因為這原因造成  (因模擬不出這Exception原因)

     

    System.InvalidOperationException: 無法編列於分散式交易,因為現存的交易已正在連接進行。請完成現存的交易並重試。
     於 System.Data.OracleClient.OracleConnection.EnlistTransaction(Transaction transaction)
    
    

    疑問2:關於transaction的release如何寫比較好 ,假如 這connection 發生exception 而導至它沒有執行 ta.Commit()或RollBack()

    那下它Run時(因Loop)建立con1.EnlistTransaction(ta);則發生上一個transaction存在??(那要怎樣清空con1下的transaction??)

     

    Q2:在RollBack前是否有必要判斷 transaction Status ??(因網路上看到~不知它有無必要要加?)

    http://www.codeproject.com/KB/dotnet/CommitableTransactions.aspx

     

    if(!ta.TransactionInformation.Status.Equals
    		(TransactionStatus.Aborted))
        ta.Rollback();
    

     

     

    感謝大家閱讀~~~

    因為我在網路上查了一陣,看得觀念還蠻亂的。

    所以想問說  是否有人有相關的經驗  可以分享

    謝謝~~~

    2010年6月25日 上午 07:38

解答

所有回覆