У меня есть сервер MS SQL с базой данных, содержащей несколько таблиц. Каждая таблица имеет поле «SN». Несколько клиентов могут работать с этой базой данных, но каждый клиент работает только с записями со своим значением SN.Как настроить сервер MS SQL, чтобы избежать блокировки обновления (LCK_M_U)
Один тип клиентского приложения - это устаревшее программное обеспечение, написанное на python с использованием pyobbc. Насколько я понимаю, это программное обеспечение может создавать длинные транзакции - он может выполнять инструкции UPDATE или INSERT и передавать их всего несколько часов спустя. Я знаю, что это неправильно делать, но не желательно изменять это программное обеспечение.
Уровень изоляции транзакции установлен на READ_COMMITED с параметром READ_COMMITTED_SNAPSHOT, установленным в положение ON.
Все работает нормально, за исключением следующего сценария:
- Во-первых, наследие клент начинает транзакцию, которая обновляет записи ти его SN значение, скажем приложение SN = 1
- Другой клиент пытается обновить записи с его SN значение , скажем, SN = 2
Эта ситуация приводит к LCK_M_U блокировки для второго клиента: ridlock поле = 1 PageId = 311 DBID = 5 ид = lock2776cf380 режим = X associatedObjectId = ... много чисел здесь ...
Хотя эти два клиента используют разные значения SN, это приводит к блокировке. Я подозреваю, что это происходит из-за того, что SQL SQL блокирует не определенные строки, а страницу (набор строк, я думаю).
В соответствии с вопросом SO (Is it possible to force row level locking in SQL Server?) блокировка ряда не гарантируется из-за эскалации блокировки.
Я считал установку уровня изоляции транзакций «READ UNCOMMITTED», но я не уверен, что это правильный путь.
Есть ли способ правильно настроить сервер MS SQL для разрешения этой блокировки и разрешить «одновременное» обновление разных строк?
Вы можете разделить таблицы на основе SN. это устранит конфликты блокировки между несколькими клиентами. – ughai
Не уверен, что это хорошо. Большинство таблиц содержат только одну запись с конкретным SN (она может быть уникальной по всей таблице, как первичный ключ), и может быть большое количество различных SN. Также в соответствии с https://msdn.microsoft.com/en-us/library/ms190787.aspx существуют ограничения на количество разделов. – Roman