Для TransactionScope требуется несколько уровней изоляции? - PullRequest
0 голосов
/ 26 августа 2010

Я сталкиваюсь с ситуациями в моем приложении, когда мне нужно использовать подсказки блокировки таблицы или установить уровень изоляции транзакции, отличный от значения по умолчанию Read Committed, для решения проблем взаимоблокировки.Я использую сервис-ориентированную архитектуру, где каждый сервисный вызов работает как элементарная операция, а Linq To Sql служит облегченным DAL.Каждый сервисный вызов вызывает мой бизнес-уровень и объявляет новую транзакцию следующим образом:

using (var scope = new TransactionScope())
{
   // Get datacontext

   // do Business Logic stuff, including database operations via Linq To Sql

   // Save transaction
   scope.Complete();
}

Проблема в том, что иногда у меня сложная бизнес-логика, которая требует много операций с базой данных.Некоторые операции чтения, некоторые записи, некоторые операции обновления и т. Д. Выполняются в рамках одного и того же вызова службы и, следовательно, в рамках одной и той же транзакции.

Я читал о неспособности Linq To Sql добавлять подсказки блокировки таблицы в ваш linq.запрос, с предложенным решением использования уровней изоляции TransactionScope вместо.Это здорово и все, но в моей ситуации, когда каждая транзакция предназначена для атомарного вызова службы, я не вижу, где это будет работать.Например, если мне нужно прочитать одну таблицу без блокировки и грязного чтения, все может быть в порядке, а затем развернуться и сделать другое чтение с целью обновления и выполнить обновление.Я не хочу устанавливать Read Uncommitted для всей транзакции, только для одного конкретного чтения, так что мне делать?

Разве я не могу реализовать расширение, которое позволило бы мне добавлять подсказки блокировки таблицы, без использования представлений или хранимых процедур, или с использованием datacontext.ExecuteQuery («здесь моя необработанная строка sql»)

1 Ответ

0 голосов
/ 27 января 2011

Я думаю, что лучшим ответом здесь является использование нескольких транзакций и пакетных транзакций, которые читают только «грязные» в одном пакете, а обновления, которые требуют чтения, зафиксированы в другом пакете.Если какая-либо информация должна объединяться, установите временный кэш-память для этих данных.

...