在不设置事务隔离级别的情况下,使用LINQ to SQL中的NOLOCK

3

有没有一种方法可以在不设置事务隔离级别的情况下,在LIN2SQL单个查询上使用NOLOCK? 我需要将其作为更大(分布式)事务的查询部分执行。

例如:

using (var txn = new TransactionScope())
{

    // query1
    // query2
    // query3
}

我希望将查询1和3的更改设置为事务性,但我需要在查询2上使用NOLOCK,而查询2恰好位于其他查询所在的单独数据库中。如果我重新设置查询2的事务范围为ReadUncommitted,则会出现以下错误:
“TransactionScope指定的事务与请求作用域的IsolationLevel不同。 参数名称:transactionOptions.IsolationLevel”
2个回答

5

这对您是否有效?

 using (var txn = new TransactionScope())
 {

    // query1
     using (TransactionScope txn2 = 
     new TransactionScope(TransactionScopeOption.RequiresNew),
     new TransactionOptions() {//isolation level,timeout, etc}
     )
     {
    // query2
      }
    // query3
  }

2
这实际上就是问题所在,尽管缺乏解释。问题是,在使用环境事务时,您无法更改IsolationLevel。通过指定RequiresNew,您将不会“加入”外部事务并尝试更改其IsolationLevel。相反,它将创建一个具有自己IsolationLevel(ReadUncommitted)的新事务。 - CodeNaked

0

把query2做成一个存储过程,在sql中加上nolock,然后从Linq2Sql中调用它怎么样?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接