2013-02-11 72 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创建静态工厂类方法,这样无论它的需要它更容易,倘若你想改变隔离级别有将成为改变它的单一地点。根据您的要求,选择最适合您的方式。