У нас есть процесс 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 для таблиц с одинаковыми именами в двух разных базах данных одновременно. Это правда? Если нет, что может быть причиной этой проблемы и как ее устранить? Это происходит только тогда, когда одновременно выполняется более одного из этих заданий, и я вижу отчеты о взаимоблокировках в файле событий.