Относительно механизма блокировки SQL Server - PullRequest
3 голосов
/ 19 января 2010

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 19 января 2010

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

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

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

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

3 голосов
/ 19 января 2010
  1. Нет. Он блокируется так, как считает нужным, и увеличивает количество блокировок по мере необходимости

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

  3. См. Пункт 2

  4. См. Пункт 2

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

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

...