Подтвердить что ты не робот

Что означает "блокировка ресурсов буфера обмена"?

У меня есть журнал ошибок, который сообщает о тупике:

Транзакция (идентификатор процесса 55) была заблокирована при блокировке | коммуникационные буферные ресурсы с другим процессом и выбран как жертва взаимоблокировки. Перезапустите транзакцию.

Я пытаюсь воспроизвести эту ошибку, но мой стандартный SQL-код тупика создает другую ошибку:

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

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

Мой вопрос: в чем смысл lock | communication buffer resources в этом контексте? Что такое "буферные ресурсы связи"? Значит ли lock | что-нибудь?

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

Моя конечная цель состоит в том, чтобы каким-то образом снова запустить первую ошибку.

4b9b3361

Ответ 1

Ваша проблема связана с parallelism, и ошибка имеет "нет смысла", поскольку сообщение об ошибке не отражает вашу проблему, и не нужно идти и изменять настройки maxdope. чтобы получить причину ошибки, вам нужно использовать флаг трассировки 1204 посмотрите, как используйте флаг трассировки и какую информацию вы получите.

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

Ответ 2

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

Это позволит избежать ошибки для этого запроса - не говорит вам, почему он не работает, но обеспечивает обход, если вам нужно быстро его запустить: -)