2011-11-11 67 views
1

我對將以各種方式調用的數據庫層進行原子寫入(插入,更新): 有時它們會被原子地調用,在這種情況下,代碼必須創建一個新的環境交易。
在其他情況下,它們可以從啓動事務範圍的業務層中的父業務流程調用,其中原子操作是必須全部在同一事務中的許多此類數據庫操作之一。在這些情況下,操作必須登記由最外層事務處理作用域使用語句創建的環境事務。 最後,在某些情況下,最外層的業務流程或最外層的事務範圍使用語句創建一個環境事務並運行多個線程來完成其工作,並且每個線程都執行數據庫必須在事務中工作。在這些情況下,我需要使用DependentTransaction模式。 (在其他場景中,我使用單元測試中的這種模式,我希望整個過程不會在數據庫中留下永久性足跡)。因此,我怎樣才能(或者應該)編寫內部的using(在嵌套的所有級別上)編碼,以確保它在從具有dependentTransaction的外部事務中調用時都能正常工作,以及當它被自己調用並且沒有環境事務時?我正在考慮使用線程嵌套TransactionScope,使用和不使用外部transactionScope

private static readonly TransactionOptions txOptRC = 
    new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted }; 

// need this when called by itself or from non-threaded outer Tx ... 
using (var scop = new TransactionScope(TransactionScopeOption.Required, txOptRC)) 
{ 
    // Transactional work here 
    scop.Complete(); 
} 

// need this when called from a multi-threaded or ThreadPooled outer Tx 
using (var scop = new TransactionScope(dependentTransaction)) 
{ 
    // Transactional work here 
    scop.Complete(); 
} 

一種方法是:

public void MyMethod(, , , , , DependentTransaction depTx = null) 
{ 
    using (var scop = depTx != null? 
     new TransactionScope(depTx): 
     TransactionScope(TransactionScopeOption.Required, txOptRC)) 
    { 
     // Transactional Work here 
     scop.Complete(); 
    } 
    // other stuff 
} 

將這項事業的任何問題? (第二個問題)據我所知,這種克隆的依賴事務模式只在嵌套的地方需要調用多個線程的下級(下層嵌套)事務工作,或者異步地(在在內部嵌套事務投票前,外部transactionScope代碼無法完成並退出使用塊的右大括號...

那麼這是否意味着如果transactionScopes的內部嵌套(一切都是同步的,並且在一個線程中),不需要處理克隆的依賴事務?這種性質的內部嵌套transactionScopes可以簡單地使用標準構造嗎?如果這是真的,我只需要使用在代碼創建多個線程或調用一個從屬方法異步地點上述condiitonal語法...

回答

0

一旦獲取外部事務作爲參數,而另一個獲取任何內容,我會有同樣的方法的兩個重載。

你的兩個從問題的體塊將成爲這兩個重載的話,我會把所有的通用代碼,你剛纔把它稱爲:

// Transactional work here 

到類的私有方法,這樣做不寫兩遍。

+0

內部數據庫層中有數百種這樣的方法。你會有兩個重載? Theres無法在一種方法中編碼? –

相關問題