Deadlock Включение CDC для нескольких таблиц одновременно - PullRequest
1 голос
/ 04 июня 2019

У нас есть процесс CICD, который может порождать задания параллельно, которые создают разные базы данных с одним и тем же набором таблиц и включают cdc в каждой из их таблиц с помощью последовательных операторов, таких как:

EXEC sys.sp_cdc_enable_table  @source_schema = N'dbo', @source_name = N'table1', @role_name = NULL;
EXEC sys.sp_cdc_enable_table  @source_schema = N'dbo', @source_name = N'table2', @role_name = NULL;
EXEC sys.sp_cdc_enable_table  @source_schema = N'dbo', @source_name = N'table3', @role_name = NULL;

.. и т.д.

Когда одновременно выполняется несколько таких заданий, они часто будут жаловаться на следующую ошибку:

Не удалось обновить метаданные, которые указывают на таблицу [dbo]. [Table1] is включен для изменения данных захвата. Ошибка произошла при выполнении команда '[sys]. [sp_cdc_add_job] @job_type = N'capture' '. Ошибка возвращено 22836: «Не удалось обновить метаданные для базы данных DatabaseForJob1, чтобы указать, что задание Change Data Capture имеет был добавлен Ошибка произошла при выполнении команды 'Msdb.dbo.sp_add_job. Возвращена ошибка: 1205: «Транзакция (Идентификатор процесса 292) заблокирован для ресурсов блокировки с другим процессом и был выбран в качестве тупиковой жертвы. Перезапустите транзакцию. Используйте действие и ошибку, чтобы определить причину сбоя и повторно отправить запрос. Используйте действие и ошибку, чтобы определить причину сбоя и повторите запрос.

Это говорит о том, что вы не можете включить CDC для таблиц с одинаковыми именами в двух разных базах данных одновременно. Это правда? Если нет, что может быть причиной этой проблемы и как ее устранить? Это происходит только тогда, когда одновременно выполняется более одного из этих заданий, и я вижу отчеты о взаимоблокировках в файле событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...