我们有一个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;
.. etc
当一次运行多个作业时,它们通常会抱怨以下错误:
无法更新指示表[dbo]的元数据。[table1]为 为更改数据捕获启用。执行时发生故障 命令'[sys]。[sp_cdc_add_job] @job_type = N'capture''。错误 返回的是22836:“无法更新数据库的元数据 DatabaseForJob1指示更改数据捕获作业具有 已添加。执行命令时发生故障 'msdb.dbo.sp_add_job'。返回的错误为1205:“交易 (进程ID 292)被另一个进程锁定在锁定资源上 并被选为僵局受害者。重新运行事务。 使用操作和错误来确定失败的原因并 重新提交请求。”。使用操作和错误来确定 导致失败的原因,然后重新提交请求。
这似乎表明您不能同时在两个不同数据库中的同名表上启用CDC。真的吗?如果不是,那么可能是什么导致此问题,以及如何解决?仅当一次运行多个以上的作业并且我确实在event_file中看到死锁报告时,才会发生这种情况。