Вы используете nolock
, когда хотите прочитать неподтвержденные данные и хотите избежать ввода каких-либо shared lock
данных, чтобы другие транзакции могли взять exclusive
блокировку для обновления / удаления.
Вам следуетне используйте nolock
с оператором update
, это действительно плохая идея, MS говорит, что nolock
игнорируется для цели update/insert
оператора.
Поддержка использования READUNCOMMITTEDи подсказки NOLOCK в предложении FROM, которые применяются к целевой таблице оператора UPDATE или DELETE, будут удалены в будущей версии SQL Server.Избегайте использования этих советов в этом контексте в новых разработках и планируйте модифицировать приложения, которые в настоящее время их используют. Источник
Относительно вашей проблемы блокировки во время нескольких обновлений, происходящих одновременно.Обычно это происходит, когда вы читаете данные с намерением обновить их позже, просто установив общую блокировку, следующий оператор UPDATE не может получить необходимые блокировки обновления, потому что они уже заблокированы общими блокировками, полученными в другом сеансе, вызываявзаимоблокировка.
Чтобы решить эту проблему, вы можете выбрать записи, используя UPDLOCK
, как указано ниже
DECLARE @IdToUpdate INT
SELECT @IdToUpdate =ID FROM [Your_Table] WITH (UPDLOCK) WHERE A=B
UPDATE [Your_Table]
SET X=Y
WHERE ID=@IdToUpdate
Это заберет необходимую блокировку обновления для записи заранее и остановит другие сеансы для получения.любая блокировка (общая / исключительная) для записи и предотвращение любых тупиков.