2016-06-21 104 views
4

我的工作在江蘇實際和預防措施的僵局應用,在那裏我發現的代碼以下行交易範圍:需要幫助使用事務範圍

var tranaction = new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }; 

// TransactionScopeOption.Required changed to Suppress for 2 tier issue with MSDTC 
using (var transactionScope = new TransactionScope(TransactionScopeOption.Suppress, tranaction)) 
{ 
    //Select entity command. 
} 

我們只是有一些select實體聲明,將允許髒讀取操作。 我已閱讀TransactionScopeOption上的一些資源,但在這裏我找不到確切TransactionScopeOption,或者覺得我們可以將選項更改爲RequiredNew,並且每次執行選擇命令時都會創建新的事務。需要幫助前進。我們使用SQL Server作爲數據源。如果我們將其更改爲RequiredNew,那麼對於應用程序中的所有選擇實體命令都會執行此更改會對性能產生什麼影響?

+0

你的問題到底是什麼? –

+0

@WicherVisser'TransactionScopeOption.Suppress'可以更改爲'TransactionScopeOption.RequiredNew'嗎? –

回答

4

如果你真的想讓IsolationLevelReadUncommitted,那麼你不應該使用TransactionScopeOption.Suppress

TransactionScopeOption.Suppress使用也不會參加任何TransactionIsolationLevel始終默認爲數據庫的默認設置,在SQL服務器IsolationLevel.ReadCommitted

您需要加入Ambient交易或創建一個新交易到IsolationLevel.ReadUncommitted

所以你絕對可以改爲TransactionScopeOption.RequiredNew以允許髒讀,如果這是你想要的。

EDIT
短答案:在某種程度上

龍答案:
升級到MS DTC是在一個單一的TransactionScope具有多於一個連接到DB的結果。

不同版本的SQL Server以不同方式處理此升級, SQL Server 2008不會升級,除非兩個連接同時打開,而先前版本將始終在多個連接上升級。

請確保您沒有多個連接在一個TransactionScope,你應該沒問題。但通過查看您的代碼,您已經打開了多個連接並創建了MS DTC升級。

使用RequiresNew表示總是創建新的TransactionScope,即使這包含在Ambient範圍內。如果處理不當,這幾乎總是會造成死鎖和超時問題。這裏最好的選擇是將您訪問DB的方式更改爲更爲經過驗證的推薦模式,以避免出現問題。

+0

[「微軟分佈式事務處理協調器」](https://en.wikipedia.org/wiki/Microsoft_Distributed_Transaction_Coordinator)是否確實扮演它的角色? –

+0

@AnkushMadankar添加了我的想法來回答 –

+0

如果我們將事務範圍更改爲'RequiredNew',您可以對性能給出您的想法。由於此更改將在所有調用中完成,因爲所有調用都在整個應用程序中具有選擇實體命令。 –

2

我不知道我理解你的問題。

如果你的意思是問,如果 - 程序 - 您可以使用RequiredNew作用域選項爲您的交易範圍,那麼是的,這是可能的:

enter image description here

是否有意義的使用RequiredNew?很可能不會,因爲它爲每個事務創建了一個交易範圍總是,而不是重新使用範圍。缺點在this SO post中提到。