2014-02-19 101 views
3

transactionscope範圍內的每個事務都爲投票投票。和TS一樣,所有的礦石都沒有。是否有可能在交易範圍內的投票中排除交易?

我想用transactionscope包裝幾個方法。

using(var ts = new TransactionScope()) 
{ 
    DoSomething1(); 
    DoSomething2(); 

    ts.Complete(); 
} 

這兩種方法都打開連接並嘗試提交。在死鎖超時的情況下,他們會嘗試多次重新創建與事務的連接。因此,我需要排除失敗的投票並保留成功。

+0

我會看到downvoter對這個問題不喜歡的評論。 –

回答

2

將重試邏輯放在TransactionScope之外。執行完畢後,您無法排除操作。您必須在執行操作之前決定事務成員資格。

您當然可以使用TransactionScopeOption.RequiresNew開始獨立交易,但它們將獨立於外部TransactionScope,這使外部TransactionScope無用。

此外,無法避免殺死事務造成死鎖。原則上要求從鎖死圖中刪除鎖。處理死鎖的正確方法是重試整個事務,僅處理其中的一部分或甚至單個語句。那會導致不完整的效果。

1

交易被定義爲「全部或全部」,它們必須符合ACID標準。如果您想允許失敗的事務,那麼它不再是事務操作,它是業務邏輯的一部分,因此應該重寫它。

TransactionScopeOption

禁止提到你可以禁止事務:創建所述範圍時,環境事務上下文被抑制。範圍內的所有操作都沒有環境事務上下文。

連接和背景信息生命週期

調用該處理涉及到打開同一數據庫的多個連接的多個邏輯多種方法必須重寫以調用整個邏輯只用一個連接和一個上下文。如果每個方法都會在一個事務中被調用,那你爲什麼要在每個方法中創建事務呢?

+0

SQL Server支持部分回滾(http://technet.microsoft.com/en-us/library/ms178157(v=sql.105).aspx)我看不出爲什麼這不能存在的事務範圍 –

+0

這裏是有點解釋爲什麼http://stackoverflow.com/questions/5412635/alternative-to-save-point-when-using-system-transactions –