我對將以各種方式調用的數據庫層進行原子寫入(插入,更新): 有時它們會被原子地調用,在這種情況下,代碼必須創建一個新的環境交易。
在其他情況下,它們可以從啓動事務範圍的業務層中的父業務流程調用,其中原子操作是必須全部在同一事務中的許多此類數據庫操作之一。在這些情況下,操作必須登記由最外層事務處理作用域使用語句創建的環境事務。 最後,在某些情況下,最外層的業務流程或最外層的事務範圍使用語句創建一個環境事務並運行多個線程來完成其工作,並且每個線程都執行數據庫必須在事務中工作。在這些情況下,我需要使用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語法...
內部數據庫層中有數百種這樣的方法。你會有兩個重載? Theres無法在一種方法中編碼? –