Какова цель ROWLOCK для удаления и когда я должен ее использовать?
Ех)
Когда я должен использовать этот оператор:
DELETE TOP (@count)
FROM ProductInfo WITH (ROWLOCK)
WHERE ProductId = @productId_for_del;
И когда нужно просто делать:
DELETE TOP (@count)
FROM ProductInfo
WHERE ProductId = @productId_for_del;
Ответы
Ответ 1
with (rowlock)
- это подсказка, которая указывает базе данных, что она должна сохранять блокировки в области строк. Это означает, что база данных будет избегать эскалации блокировок для блокировки или области таблицы.
Вы используете подсказку, когда запрос будет зависеть только от одного или нескольких строк, чтобы блокировка не блокировала строки, которые не будут удалены запросом. Это позволит другому запросу одновременно считывать несвязанные строки, а не ждать завершения удаления.
Если вы используете его в запросе, который удалит много строк, это может привести к ухудшению производительности, поскольку база данных будет пытаться избежать наращивания блокировок в большую область, даже если бы она была более эффективной.
Обычно вам не нужно добавлять такие подсказки к запросу, потому что база данных знает, какую блокировку использовать. Это только в ситуациях, когда вы получаете проблемы с производительностью, потому что база данных приняла неверное решение, что вы должны добавить такие подсказки к запросу.
Ответ 2
Rowlock - это подсказка для запроса, которую следует использовать с осторожностью (как и все подсказки).
Опущение это, вероятно, все равно приведет к точному поведению и обеспечению его не гарантирует, что он будет использовать только rowlock, это всего лишь намек. Если у вас нет очень глубоких знаний о конфликтах, то вероятность того, что оптимизатор выберет наилучшую возможную стратегию блокировки, и эти вещи обычно лучше всего оставлять для механизма базы данных, чтобы решить.
ROWLOCK означает, что SQL будет блокировать только затронутую строку, а не всю таблицу или страницу в таблице, где данные сохраняются при выполнении удаления. Это повлияет только на других людей, читающих из таблицы одновременно с запуском вашего удаления.
Если используется блокировка таблицы, это приведет к тому, что все запросы в таблице будут ждать завершения вашего удаления, при этом блокировка строк будет выбирать только чтение, в котором будут выполняться определенные строки.
Удаление вершины N, где N - количество строк, скорее всего, заблокирует таблицу в любом случае.