我在高層使用TransactionScope
來包裝一些高級代碼,這些代碼與數據庫建立了很多連接。如何在高層指定要使用的數據庫隔離級別?
我調用的函數之一是一個通用讀取,用於只讀功能,其中需要隔離級別爲read uncommitted
。但在某些情況下,它被用作大型更新操作的一部分,並且read committed
會更合適。
在我在事務範圍內調用函數的最高級別上,我應該能夠設置事務的隔離級別嗎?
我在高層使用TransactionScope
來包裝一些高級代碼,這些代碼與數據庫建立了很多連接。如何在高層指定要使用的數據庫隔離級別?
我調用的函數之一是一個通用讀取,用於只讀功能,其中需要隔離級別爲read uncommitted
。但在某些情況下,它被用作大型更新操作的一部分,並且read committed
會更合適。
在我在事務範圍內調用函數的最高級別上,我應該能夠設置事務的隔離級別嗎?
您可以在TransactionScope本身上設置隔離級別。你是這個意思嗎?
using (var txn = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadUncommitted
}
))
{
// Your LINQ to SQL query goes here
}
(代碼從我的博客文章here被盜。)
您可以同時在連接級別和語句/事務級定義的事務隔離級別。
如果我正確理解您的方案,我會考慮僅在您的特定更新查詢之前調整事務隔離級別,前提是給定連接中的大多數其他活動將爲只讀活動。
請記住,SQL Server的默認隔離級別是讀取已提交,因此如果您在連接級別設置了不同的隔離級別,則需要在更新之前切換到事務/語句級別的讀取已提交。
要考慮的一件事當然是離開默認的隔離級別。爲什麼您認爲Read Committed不適合您的通用閱讀活動,是否有特定的原因?
有意義嗎?讓我知道你是否需要進一步澄清。
乾杯,約翰
更新基於意見。
不夠公平,如果你正在開發一個高端的OLTP數據庫,你可能想看看一個叫做行版本控制的SQL Server技術/原理。這將允許您執行某個記錄版本的讀取操作。在使用這種技術時,tempdb會有開銷,但如果您使用的是足夠的硬件,那麼它可能是適當的。 下面的白皮書是一個很好的引導到SQL Server的行版本/快照隔離
發生大的插入/刪除操作時,提交的讀取操作會阻止我。 – tpower 2009-03-04 11:50:55
謝謝,我不知道我怎麼錯過了。 – tpower 2009-03-04 11:49:03