2010-07-27 44 views
0

早安所有,如何強制TransactionScope跨數據庫調用使用相同的連接?

我有類似以下

try{ 
    using(var tx = new TransactionScope()){ 

     var Xupdated = someDao.DoSomeUpdateQuery(); //this dao uses MS Data ApplicationBlock 

     var Yupdated = someDao.DoSomeOtherUpdateQuery(); //this dao also uses MS Data ApplicationBlock 

    if(Xupdated && Yupdated) 
    { 
     tx.Complete(); 
    } 

    } 
} catch(Exception ex){ 

    DoSomethingWithTheException(); 
} 

的DAO方法的代碼有這樣的代碼

try{ 
var db = DatabaseFactory.CreateDatabase(); 
var cmd = db.GetStoredProcCommand(someSP); 
    var retVal = db.ExecuteNonQuery(cmd); 
return (retVal > 0); 
} catch (SqlException ex){ 
    CustomException custom = new CustomException(ex.Message, ex); 
    throw custom; 

}

這裏的問題是,當「Yupdated '返回false,我想'DoSomeUpdateQuery()'被回滾。不幸的是,'DoSomeUpdateQuery()'的改變被提交。我該如何補救?我把一個斷點放到tx.Complete()中,永遠不會調用。有誰知道我能在這裏得到合適的預期行爲嗎?提前感謝任何指針。

乾杯,
〜在聖地亞哥

回答

0

CK你已經擁有適當的行爲只要DatabaseFactory類,不管它是什麼,以協同的方式表現。如果someDao電話似乎獨立行事,這可能意味着他們正在積極創建一個TranscationScopeOption.Supress的內部範圍。另一個問題可能是CreateDatabase調用內部緩存某些SqlConnection並且不依賴於SqlClient連接池,因此可能會將連接註冊繞過事務。

作爲一個側面說明,即使這個工程如期望的那樣,這將是強大的低效的,因爲你會註冊兩個不同的連接到分佈式事務,這將延緩處理很大交易。一個好的數據訪問層接受Sqlconnection作爲參數,這樣它就可以在調用之間共享它,從而將事務範圍本地保留在服務器上。

相關問題