Я сталкиваюсь с ситуациями в моем приложении, когда мне нужно использовать подсказки блокировки таблицы или установить уровень изоляции транзакции, отличный от значения по умолчанию 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»)