如何实现此命令以防止LINQ to SQL出现死锁?

时间:2010-09-17 15:07:30

标签: c# .net linq-to-sql

我想在我的项目中使用LINQ to SQL实现SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。我的理解是,这将影响全局的所有select语句。

我把它放在包含上下文对象的DAL中吗?如果是这样,怎么样?

谢谢! 标记

4 个答案:

答案 0 :(得分:2)

您可以按照DataContext /单位工作基础执行此操作:

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

    using (var tran = 
        new con.BeginTransaction(IsolationLevel.ReadUncommitted))
    {
        using (var db = new MyDataContext(con))
        {
            // You need to set the transaction in .NET 3.5 (not in 4.0).
            db.Transaction = tran;

            // Do your stuff here.

            db.SubmitChanges();
        }

        tran.Commit();
    }
}

当然,您可以抽象出连接和事务的创建,提交和处理,但这个例子可行。

请注意,这不会全局设置隔离级别,只是针对在特定DataContext类的上下文中执行的LINQ语句。

答案 1 :(得分:1)

尝试在整个数据库上设置READ COMMITTED SNAPSHOT。

见这里:http://www.codinghorror.com/blog/2008/08/deadlocked.html

答案 2 :(得分:1)

严格地说,Linq不是数据库查询语言。它是一种域查询语言,可以转换为SQL查询语言,如SQL。因此,您不能仅使用Linq来设置数据库隔离级别。

我会看看你的ORM给你的工具;大多数,在某种程度上,涉及ADO风格的SQLConnection和SQLTransactions。您应该能够公开给定ORM的“会话”对象,以便设置隔离级别并执行其他非DML数据库命令。

答案 3 :(得分:1)

我喜欢本文中有关创建基类的想法,该基类将为您设置所需的事务隔离级别。在我看来,这个功能应该包含在框架中。

http://www.codeproject.com/KB/linq/LINQ_Transactions.aspx