2016-08-09 39 views
0

我有一個TransactionScope,我的所有SQL Server連接都加入了。如果任何一個調用失敗,所有事情都按照預期正確回滾。如何僅在TransactionScope已提交時才運行自定義C#函數?

但是,我有多個數據存儲,有時需要在同一個調用中更新。第二個數據存儲不會自動登記到事務中。

我對如何阻止其他數據存儲過早獲取數據有一些想法。我的第一個想法是一個ExecutionContext級別的屬性,只有當設置爲一個值(例如提交或回滾爲true或false)時,我的事件纔會更新其他數據存儲。

但是,這似乎相當hacky。

是否有一種內置於TransactionScope對象中的方法,只有在提交發生後才能運行函數?沿

Transaction.Scope.Current.Enlist(
    onCommit:() => MyCustomSuccessFunction(), 
    onRollback:() => MyCustomFailureFunction()); 
+0

也許你應該包裝你的CA你會得到一個幫助函數,它允許你傳遞提交/回滾函數引用。我沒有意識到ADO.Net有任何「內置」,但如果您使用特定的抽象/ orm,它可能包含某些內容。目前這個問題太寬泛,無法正確回答。 –

回答

0

東西線找到一份像樣的答案在這裏:https://msdn.microsoft.com/en-us/library/ms149779(v=vs.110).aspx

private class FooEnlistment : IEnlistmentNotification 
    { 
     private readonly Action _CommitAction; 

     private readonly Action _RollbackAction; 

     public EventEnlistment(Action onCommit, Action onRollback) 
     { 
      _CommitAction = onCommit; 
      _RollbackAction = onRollback; 
     } 

     public void Prepare(PreparingEnlistment preparingEnlistment) 
     { 
      preparingEnlistment.Prepared(); 
     } 

     public void Commit(Enlistment enlistment) 
     { 
      _CommitAction(); 
      enlistment.Done(); 
     } 

     public void Rollback(Enlistment enlistment) 
     { 
      _RollbackAction(); 
      enlistment.Done(); 
     } 

     public void InDoubt(Enlistment enlistment) 
     { 
      enlistment.Done(); 
     } 
    } 

然後,在這個問題,而不是

Transaction.Scope.Current.Enlist(
     onCommit:() => MyCustomSuccessFunction(), 
     onRollback:() => MyCustomFailureFunction()); 

你會做:

var enlistment = new FooEnlistment(MyCustomSuccessFunction, MyCustomFailureFunction); 
    Transaction.Current.EnlistVolatile(enlistment, EnlistmentOptions.None); 
相關問題