SQL Server SELECT With (NOLOCK), вызывающий монопольную блокировку в базе данных tempdbPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 SQL Server SELECT With (NOLOCK), вызывающий монопольную блокировку в базе данных tempdb

Сообщение Anonymous »

У меня есть php-приложение, которое зависает на неопределенный срок в ожидании блокировки Microsoft SQL Server 2019. Сценарий использует драйвер SQLSRV. Существует два запроса SELECT, обращающихся к локальной временной таблице, оба из которых пытаются получить монопольную блокировку объекта. Первая блокировка разрешена, но процесс навсегда зависает в приостановленном состоянии. Второй запрос делает то же самое, ожидая блокировки, предоставленной первому запросу. Странно то, что оба запроса используют With (NOLOCK).
Вот первый запрос:

Код: Выделить всё

SELECT * FROM #ids_temp WITH (NOLOCK) WHERE backupid = N'4dd31554df67d8503fba000945fbe02a' AND itemname = N'user'
sys.dm_os_waiting_tasks сообщает, что тип ожидания — ASYNC_NETWORK_IO.
Второй запрос аналогичен первому:

Код: Выделить всё

SELECT 'x' FROM #ids_temp WITH (NOLOCK) WHERE backupid = N'4dd31554df67d8503fba000945fbe02a' AND itemname = N'userfinal' AND itemid = '3' ORDER BY 1 OFFSET 0 ROWS  FETCH NEXT 1 ROWS ONLY
Тип ожидания — LCK_M_X. Судя по всей документации, которую мне удалось найти, ни один из этих запросов не должен запрашивать эксклюзивную блокировку. Есть ли какая-то настройка базы данных, которая может требовать монопольной блокировки для выбранных запросов? Как я могу запретить этим запросам запрашивать эксклюзивные блокировки?
Я попробовал переписать PHP-скрипт, чтобы он вызывал sqlsrv_free_stmt после первого запроса и до запуска второго, чтобы снять блокировку временного файла. стол. Однако я заметил, что та же проблема возникает и в других областях кода. Приложение PHP изначально было написано для базы данных MySQL и прекрасно работает в такой среде. Поэтому вместо того, чтобы пытаться найти каждый экземпляр кода, предназначенного для запуска без блокировок во временных таблицах, кажется, лучше настроить поведение базы данных в соответствии с кодом.

Подробнее здесь: https://stackoverflow.com/questions/781 ... -in-tempdb
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»