О механизме блокировки SQL Server

Я хотел бы задать пару вопросов о механизме блокировки SQL Server.

  1. Если я не использую подсказку блокировки с оператором SQL, SQL Server по умолчанию использует подсказку PAGELOCK. я прав??? Если да, то почему? может быть это связано с управлением слишком большим количеством замков, это единственное, что я считаю недостатком, но, пожалуйста, дайте мне знать, если есть другие. а также скажите мне, можем ли мы изменить это поведение по умолчанию, если это разумно.

  2. Я пишу приложение на стороне сервера, сервер синхронизации (не используя структуру синхронизации), и я написал запросы к базе данных в файле кода C # и использую соединение ODBC для их выполнения. Теперь вопрос заключается в том, как лучше всего изменить блокировку по умолчанию со страницы на строку с учетом недостатков (например, добавление подсказки блокировки в запросы, это то, что я планирую).

  3. Что делать, если SQL-запрос (SELECT/DML) выполняется без области транзакции, а оператор содержит подсказку блокировки, то какой тип блокировки будет получен (например, общая, обновление, эксклюзивная)? И, хотя в области транзакции уровень изоляции транзакции влияет на тип блокировки, если используется подсказка ROWLOCK.

  4. Наконец, если бы кто-нибудь мог дать мне образец, чтобы я мог протестировать и испытать все вышеперечисленные сценарии самостоятельно (например, точечный сетевой код или сценарий sql)

Спасибо, Мубашар.


person Mubashar    schedule 19.01.2010    source источник


Ответы (2)


  1. Нет. Он блокирует по своему усмотрению и эскалирует блокировки по мере необходимости.

  2. Пусть движок БД управляет этим

  3. См. пункт 2

  4. См. пункт 2

Я бы использовал подсказки блокировки, только если вам нужно конкретное и определенное поведение, например очереди или неблокирующие (грязные) чтения.

В более общем смысле, почему вы думаете, что механизм БД не может делать то, что вы хотите по умолчанию?

person gbn    schedule 19.01.2010

Блокировка по умолчанию — это блокировка строк, а не блокировка страниц, хотя способ работы механизма блокировки означает, что вы будете размещать блокировки на всех объектах в иерархии, например. чтение одной строки установит общую блокировку на таблицу, общую блокировку на страницу, а затем общую блокировку на строку.

Это позволяет действию, запрашивающему эксклюзивную блокировку таблицы, знать, что оно может еще не взять ее, поскольку присутствует общая блокировка (в противном случае ему пришлось бы проверять каждую страницу/строку на наличие блокировок).

Однако, если вы устанавливаете слишком много блокировок для отдельного запроса, он выполняет укрупнение блокировки, что снижает степень детализации блокировки, поэтому он управляет меньшим количеством блокировок. Это можно отключить с помощью флага трассировки, но я бы не стал это рассматривать.

Пока вы не узнаете, что действительно имеете дело с блокировкой/эскалацией блокировки, вы рискуете преждевременно оптимизировать несуществующую проблему.

person Andrew    schedule 19.01.2010