2

需要对带有 linq 的 Dbml 文件的建议,我们有大量数据的数据库。有时表中存在锁定。因此我们需要在 dbml 类上应用未提交读取的隔离级别(我们知道此隔离级别的一些缺点)。

我在 dbml 文件中将苹果下面的代码作为部分类

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

这是一种正确的实施方式吗?或对此提出任何半途而废的建议。

谢谢

4

2 回答 2

5

如果这样做,则需要将事务附加到该连接上的每个命令,这不是 LINQ-to-SQL 将为您做的事情(尽管有一些方法可以让它了解事务实例)。也许一种选择是使用接受连接的重载,并简单地提供一个已经打开的连接,您已经通过以下方式踩踏了隔离级别:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

当然,如果你这样做了——那么现在你的工作就是在你完成后正确地处理连接:LINQ-to-SQL 将假定你正在管理连接的生命周期。

LINQ-to-SQL 数据上下文的另一个选项是使用该ExecuteQuery<T>(sql, args)方法,它允许您传入自己的原始 TSQL - 这显然意味着您不再真正使用LINQ,但它允许您NOLOCK在很少有战术意义的地方(仅使用物化器的数据上下文)。这更加细化,并允许您专注于高吞吐量/高并发表。

于 2013-02-11T12:20:24.413 回答
3

您可以将与数据库交互的代码放在一个TransactionScope块中,并为 TransactionScope 设置所需的隔离级别。

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

当然,更进一步,您可以将 transactionScope 的创建封装在类似工厂的静态方法中,以便在需要的地方更容易,如果您想更改隔离级别,将有一个单独的地方可以更改它。根据您的要求,选择最适合您的。

于 2013-02-11T12:37:17.360 回答