Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

  2. Позвольте движку базы данных управлять этим

  3. Смотрите пункт 2

  4. Смотрите пункт 2

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

В более общем плане, как вы думаете, почему движок DB не может делать то, что вы хотите по умолчанию?

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top