2009-03-04 44 views
3

我在高層使用TransactionScope來包裝一些高級代碼,這些代碼與數據庫建立了很多連接。如何在高層指定要使用的數據庫隔離級別?

我調用的函數之一是一個通用讀取,用於只讀功能,其中需要隔離級別爲read uncommitted。但在某些情況下,它被用作大型更新操作的一部分,並且read committed會更合適。

在我在事務範圍內調用函數的最高級別上,我應該能夠設置事務的隔離級別嗎?

回答

4

您可以在TransactionScope本身上設置隔離級別。你是這個意思嗎?

using (var txn = new TransactionScope(
    TransactionScopeOption.Required, 
    new TransactionOptions 
    { 
     IsolationLevel = IsolationLevel.ReadUncommitted 
    } 
)) 
{ 
    // Your LINQ to SQL query goes here 
} 

(代碼從我的博客文章here被盜。)

+0

謝謝,我不知道我怎麼錯過了。 – tpower 2009-03-04 11:49:03

1

您可以同時在連接級別和語句/事務級定義的事務隔離級別。

如果我正確理解您的方案,我會考慮僅在您的特定更新查詢之前調整事務隔離級別,前提是給定連接中的大多數其他活動將爲只讀活動。

請記住,SQL Server的默認隔離級別是讀取已提交,因此如果您在連接級別設置了不同的隔離級別,則需要在更新之前切換到事務/語句級別的讀取已提交。

要考慮的一件事當然是離開默認的隔離級別。爲什麼您認爲Read Committed不適合您的通用閱讀活動,是否有特定的原因?

有意義嗎?讓我知道你是否需要進一步澄清。

乾杯,約翰

更新基於意見。

不夠公平,如果你正在開發一個高端的OLTP數據庫,你可能想看看一個叫做行版本控制的SQL Server技術/原理。這將允許您執行某個記錄版本的讀取操作。在使用這種技術時,tempdb會有開銷,但如果您使用的是足夠的硬件,那麼它可能是適當的。 下面的白皮書是一個很好的引導到SQL Server的行版本/快照隔離

http://msdn.microsoft.com/en-us/library/ms345124.aspx

+2

發生大的插入/刪除操作時,提交的讀取操作會阻止我。 – tpower 2009-03-04 11:50:55