如何在LINQ to SQL中使用WITH(NOLOCK)?

4
我们可以像这样使用SQL:
SELECT * FROM student WITH(NOLOCK);

如何在不使用TransactionScope的情况下通过LINQ to SQL实现这一点?


为什么要使用NOLOCK? - Mitch Wheat
李高人,我的回答对您有用吗? - Steven
为什么你不想使用TransactionScope? - KristoferA
我可以想象他为什么不想要。你并不总是希望所有东西都在一个事务中完成。以记录信息为例,你永远不希望它被回滚。你必须特别小心确保它们不会被回滚。然而,我喜欢在我的集成测试中使用TransactionScope。 - Steven
1个回答

11

LINQ to SQL没有实现这种机制,但是你可以创建一个带有特定隔离级别的事务。请参考下面的代码:

using (var con = new SqlConnection("constr"))
{
    con.Open();

    using (var transaction = con.BeginTransaction(
        IsolationLevel.ReadUncommitted))
    {
        using (var context = new SchoolDataContext(con))
        {
            // HACK: Setting the context.Transaction is 
            // needed in .NET 3.5 (fixed in .NET 4.0).
            context.Transaction = transaction;
            var q = from s in context.Students select c;
        }
    }
}

有时使用这种类型的隔离是很有用的,例如出于性能考虑。但请确保不要使用此类型的数据库隔离执行任何创建、更新或删除(CUD)操作。当然,这取决于您的情况,但您的数据可能会处于不一致的状态。


请原谅我回复晚了,最近是中国春节。这个问题部分原因在于我的团队成员总是在简单的三层架构中写nolock语句。他们不想失去对数据库的控制权。他们甚至想在Nhibernate中使用nolock,我为此放弃了Nhibernate。他们并没有完全理解ORM的工作原理。现在,我的问题是如何说服他们在不考虑数据访问细节的情况下使用ORM? - ligaoren
P.S Steven's 的答案很棒。 - ligaoren

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