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

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