Что означает "блокировка ресурсов буфера обмена"?
У меня есть журнал ошибок, который сообщает о тупике:
Транзакция (идентификатор процесса 55) была заблокирована при блокировке | коммуникационные буферные ресурсы с другим процессом и выбран как жертва взаимоблокировки. Перезапустите транзакцию.
Я пытаюсь воспроизвести эту ошибку, но мой стандартный SQL-код тупика создает другую ошибку:
Транзакция (идентификатор процесса 54) была заблокирована с помощью ресурсов блокировки с другим процессом и была выбрана в качестве жертвы взаимоблокировки. Перезапустите транзакцию.
Я хочу быть предельно ясным, что я не спрашиваю, что за тупик. Я действительно понимаю основы.
Мой вопрос: в чем смысл lock | communication buffer resources
в этом контексте? Что такое "буферные ресурсы связи"? Значит ли lock |
что-нибудь?
Мое лучшее предположение заключается в том, что буфер обмена используется, когда параллельные потоки объединяют свои результаты. Кто-нибудь может подтвердить или опровергнуть это?
Моя конечная цель состоит в том, чтобы каким-то образом снова запустить первую ошибку.
Ответы
Ответ 1
Ваша проблема связана с parallelism, и ошибка имеет "нет смысла", поскольку сообщение об ошибке не отражает вашу проблему, и не нужно идти и изменять настройки maxdope. чтобы получить причину ошибки, вам нужно использовать флаг трассировки 1204 посмотрите, как используйте флаг трассировки и какую информацию вы получите.
Когда вы это сделаете, вы получите ответ о том, почему, где и какая строка кода вызвала блокировку. Я предполагаю, что вы можете сделать это самостоятельно, и если нет, опубликуйте его, и вы получите ответ, который вам нужен.
Ответ 2
Вы можете использовать MAXDOP 1 в качестве подсказки запроса - например, выполнить этот запрос на одном процессоре - без ущерба для остальной части сервера.
Это позволит избежать ошибки для этого запроса - не говорит вам, почему он не работает, но обеспечивает обход, если вам нужно быстро его запустить: -)