【问题标题】:isolation level in linq to sql , DataContextlinq to sql 中的隔离级别,DataContext
【发布时间】:2013-02-11 12:18:03
【问题描述】:
需要关于 linq 的 Dbml 文件的建议,我们有大量数据的数据库。有时表中存在锁定。因此我们需要在 dbml 类上应用未提交读取的隔离级别(我们知道此隔离级别的一些缺点)。
我在 dbml 文件中将苹果下面的代码作为部分类
partial class MainDataContext
{
public MainDataContext()
{
base.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);
}
}
这是一种正确的实施方式吗?或对此提出任何半途而废的建议。
谢谢
【问题讨论】:
标签:
c#
.net
linq
linq-to-sql
【解决方案1】:
如果您这样做,您将需要将事务附加到 该连接上的每个命令,这不是 LINQ-to-SQL 将为您做的事情(尽管有一些方法让它知道一个事务实例)。也许一种选择是使用接受连接的重载,并简单地提供一个已经打开的连接,您已经通过以下方式踩踏了隔离级别:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
当然,如果您这样做了 - 那么现在您的工作是在您完成后正确处理连接:LINQ-to-SQL 将假定您正在管理连接生命周期。 p>
另一个使用 LINQ-to-SQL 数据上下文的选项是使用 ExecuteQuery<T>(sql, args) 方法,它允许您传入自己的原始 TSQL - 这显然意味着您并没有真正使用 LINQ 更多,但它允许您在一些具有战术意义的地方添加NOLOCK 等(仅使用物化器的数据上下文)。这更加细化,让您可以专注于高吞吐量/高并发表。
【解决方案2】:
您可以将与数据库交互的代码放在TransactionScope 块中,并为 TransactionScope 设置所需的隔离级别。
TransactionOptions _transactionOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.Snapshot };
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, _transactionOptions))
{
//your code here
}
当然,更进一步,您可以将 transactionScope 的创建封装在类似工厂的静态方法中,以便在需要的地方更容易,并且如果您想更改隔离级别,将会有一个 singurla改变它的地方。根据您的要求,选择最适合您的。