【问题标题】: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改变它的地方。根据您的要求,选择最适合您的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多