Как мне реализовать эту команду, чтобы предотвратить взаимные блокировки с LINQ to SQL? - PullRequest
6 голосов
/ 17 сентября 2010

Я хотел бы реализовать SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED в моем проекте, который использует LINQ to SQL. Насколько я понимаю, это повлияет на все избранные утверждения в глобальном масштабе.

Должен ли я поместить это в мой DAL, который содержит объект контекста? Если да, то как?

Спасибо! Mark

Ответы [ 4 ]

2 голосов
/ 17 сентября 2010

Вы можете сделать это в расчете на 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();
    }
}

Конечно, вы можете абстрагироваться от создания, фиксации и удаления соединения и транзакции, но этопример будет работать.

Обратите внимание, что это не установит уровень изоляции глобально, только для операторов LINQ, которые выполняются в контексте этого конкретного DataContext класса.

1 голос
/ 18 сентября 2010

Мне нравятся идеи в этой статье по созданию базового класса, который установит для вас желаемый уровень изоляции транзакции.На мой взгляд, эта функция должна была быть включена в рамки.

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

1 голос
/ 17 сентября 2010

Linq, строго говоря, не является языком запросов к базе данных.Это язык запросов домена, который можно перевести на язык запросов БД, такой как SQL.Таким образом, вы не можете использовать только Linq для установки уровня изоляции базы данных.

Я бы посмотрел на инструменты, которые дает вам ORM;большинство, на некотором уровне, включают SQLConnection в стиле ADO и SQLTransactions.Вы должны быть в состоянии представить их, учитывая ваш «сеансовый» объект ORM, чтобы установить уровни изоляции и выполнить другие команды базы данных, не относящиеся к DML.

1 голос
/ 17 сентября 2010

Попробуйте установить READ COMMITTED SNAPSHOT для всей базы данных.

См. Здесь: http://www.codinghorror.com/blog/2008/08/deadlocked.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...