0

在以编程方式设置推送复制时,我注意到在运行 sp_link_publication 时出现死锁。死锁似乎与触发顺序有关。

这是我认为出了问题的地方:

var publisherSubscriptionParams = new Dictionary<string, object>
            {
                {"publication", publisherDatabase}, {"article", "all"}, {"subscriber", subscriberServer},
                {"destination_db", subscriberDatabase}, {"subscription_type", "Push"}, {"sync_type", "replication support only"}, {"update_mode", "queued failover"}
            };

使用 sp_addsubscription

var publisherPushSubscriptionAgentParams = new Dictionary<string, object> { { "publication", publisherDatabase }, { "subscriber", subscriberServer }, { "subscriber_db", subscriberDatabase }, { "subscriber_security_mode", 1 } };

使用 sp_addpushsubscription_agent

var subscriberParams = new Dictionary<string, object>
        {
            {"publisher", publisherServer}, {"publisher_db", publisherDatabase},
            {"publication", publisherDatabase}, {"distributor", distributorServer}, {"security_mode", 1}
        };

使用 sp_link_publication

sp_addsubscription 将 [trg_MSsync_del_...] 之类的触发器添加到我的数据库表对象中。然而,当这种情况发生时,我认为命令 sp_link_publication 会发生冲突并形成死锁。有人对此有任何经验/建议吗?

我可以看到通过查询添加的触发器:

select sys.tables.name,sys.triggers.name,sys.trigger_events.type
,sys.trigger_events.type_desc, is_first,is_last
,sys.triggers.create_date,sys.triggers.modify_date
from sys.triggers inner join sys.trigger_events
on sys.trigger_events.object_id = sys.triggers.object_id
inner join sys.tables on sys.tables.object_id = sys.triggers.parent_id
order by modify_date

添加所有触发器后,如果我运行 sp_link_publication,则不会出现死锁。

有任何想法吗?

4

0 回答 0