2013-02-11 73 views
2

需要關於linq的Dbml文件的建議,我們有大量數據的數據庫。有時候會出現表鎖的問題,所以我們需要在dbml類上應用隔離級別和讀取未完成(我們知道這個隔離級別的一些缺點)。linq到sql的隔離級別,DataContext

我有以下的dbml文件代碼蘋果作爲一個分部類

partial class MainDataContext 
{ 
    public MainDataContext() 
    { 
     base.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); 
    } 
} 

是它來實現一個適當的方式?或者給它提出任何建議。

感謝

回答

5

如果你這樣做,你需要將每一個交易命令連接,這是不是會爲你做(儘管有SQL LINQ到上附着如何讓它知道事務實例)。也許一個選擇是使用接受連接的過載,並簡單地提供在你已經踩在經由隔離級別一個已經打開的連接:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

當然,如果你這樣做 - 那麼它現在你的工作在你完成後正確地處理連接:LINQ-to-SQL會假設你正在管理連接的生命週期。

與LINQ到SQL數據上下文另一種選擇是使用ExecuteQuery<T>(sql, args)方法,它可以讓你在自己的原始TSQL傳遞 - 這顯然意味着你沒有真正使用LINQ更多,但它允許你在幾個有戰術意義的地方添加NOLOCK等等(只需使用物化器的數據上下文)。這更加細化,並允許您專注於高吞吐量/高並發表。

3

您可以將與db交互的代碼放在TransactionScope塊中,併爲TransactionScope設置所需的隔離級別。

TransactionOptions _transactionOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.Snapshot }; 
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, _transactionOptions)) 
{ 
//your code here 
} 

當然,採取這一一步,你可以封裝一個TransactionScope創建靜態工廠類方法,這樣無論它的需要它更容易,倘若你想改變隔離級別有將成爲改變它的單一地點。根據您的要求,選擇最適合您的方式。