SQLServer 可更新訂閱資料衝突的乙個原因

2021-09-07 16:40:01 字數 1436 閱讀 8057

原文:

sqlserver 可更新訂閱資料衝突的乙個原因

可更新訂閱為什麼有衝突?

可更新訂閱中,當公升級增加乙個欄位時,通常在發布伺服器的發布資料庫中增加,對錶增加欄位後,發布自動同步到訂閱資料庫中(複製架構更改=true)。但是,如果此時在訂閱資料庫進行dml操作,資料將不會同步到發布表中;這些差異資料在訂閱表中如果一直未進行dml 操作,也就不會再次同步到發布中,存在差異。

複製配置環境:

可更新訂閱事務複製

發布和訂閱衝突都以訂閱為準

使用排隊更新

在訂閱操作

衝突測試結果(以下為: 當資料存在不一致的情況下,對訂閱再次操作會引起衝突,衝突策略會自動解決):

當發布資料不存在,訂閱資料存在時,此時更新訂閱資料:(排隊更新衝突)

當發布和訂閱主鍵相同,

msrepl_tran_version

不同時,此時更新訂閱資料:(排隊更新衝突)

以上兩種情況結果:

在發布衝突,衝突表記錄值都為最新值,訂閱資料更新或插入到發布表中。

當發布資料不存在,訂閱資料存在時,此時刪除訂閱資料:(排隊更新衝突)

當發布和訂閱主鍵相同,

msrepl_tran_version

不同時,此時刪除訂閱資料:(排隊更新衝突)

以上兩種情況結果:

刪除操作同步到發布時衝突。

衝突入選方:

此行不再存在於「[dbo].[testtab]」中。 [[dbo].[testtab]].[qcfttabrowid] 中唯一 id 的值是「8d335a44-36a0-432c-bba4-4979df3c804e」。

衝突落選方:

嘗試刪除此位置上的此資料時出現上述錯誤,原因可能是此刪除操作違反了乙個或多個約束。如果您忽略此衝突,則應通過其他方式加以解決。您可以記錄此衝突的詳細資訊,然後將日誌條目傳送給系統管理員。

架構更如何防止衝突?

若要在支援更新訂閱的發布中的表上進行架構更改,必須在發布伺服器和訂閱伺服器中停止該錶上的所有活動,還必須將掛起的資料更改傳播到所有節點,然後才能進行架構更改。這可以確保未完成的事務不會與掛起的架構更改發生衝突。架構更改傳播到所有節點後,可以在已發布的表上恢復活動。如何停止複製拓撲(複製 transact-sql 程式設計)

參考: 事務複製的可更新訂閱

SqlServer發布訂閱

我們在開發系統的時候,經常會遇到高併發的問題,還有高可用性和安全性方面的考慮,需要用讀寫分離的方案來解決問題。也就是在我們使用資料庫比較多,更新少而查詢比較多的情況下使用讀寫分離,實現提高效能,減少資料庫壓力。為啥要用讀寫分離呢?因為資料庫的 寫 操作是比較耗時的 但是資料庫的 讀 操作卻很快。所以...

可更新聚集列儲存索引幻想

在今天的文章裡,我想專門詳細談下sql server 2014引入的可更新聚集列儲存索引 updateable clustered columnstore index 在我們進入細節討論前,我想先給你簡單介紹下它在sql server 2012裡出現時的情況,還有它們的侷限性。sql server ...

可更新聚集列儲存索引幻想

在今天的文章裡,我想專門詳細談下sql server 2014引入的可更新聚集列儲存索引 updateable clustered columnstore index 在我們進入細節討論前,我想先給你簡單介紹下它在sql server 2012裡出現時的情況,還有它們的侷限性。sql server ...