Для структуры таблицы, которую вы показали, и UPDATE
, и SELECT
являются автономными транзакциями и могут использовать поиск кластеризованных индексов для выполнения своей работы без необходимости читать ненужные строки и устанавливать ненужные блокировки, так что меня это не особенно беспокоит. о взаимоблокировках с этой процедурой.
Меня больше беспокоит тот факт, что у вас нет UPDATE
и SELECT
внутри одной транзакции. Таким образом, блокировка X
для строки будет снята, как только оператор обновления завершится, и другая транзакция сможет изменить значение столбца (или даже удалить всю строку) до выполнения SELECT
.
Если вы выполняете оба оператора внутри одной и той же транзакции, я все равно не буду беспокоиться о потенциальной взаимоблокировке, поскольку первичная блокировка берется первой (было бы другое дело, если бы SELECT
произошло до UPDATE
)
Вы также можете решить проблему параллелизма, полностью избавившись от SELECT
и используя предложение OUTPUT
для возврата клиенту значения после обновления.
UPDATE Test SET Column1 = Column1 & ~2
OUTPUT INSERTED.Column1
WHERE Id = 1