一、對等複寫衝突產生原因
單一資料庫靠鎖機制避免衝突,但異步分散式環境中,各節點獨立執行交易,缺乏跨節點序列化機制。舊版靠兩階段提交影響效能。SQL 2008 引入衝突偵測機制解決此問題。
典型衝突情境
- 三分公司各有伺服器 (A/B/C) 做 OA 系統
- A 插入員工編號 PR001,B 同時也插入 PR001 (PK 衝突)
- 單節點提交時無衝突,複寫至其他節點應用時才偵測到
二、衝突偵測運作原理
- 每個已發行資料表新增隱藏欄位,儲存「發起者 ID + 列版本」
- 散發代理同步時,針對每表執行同步程序
- 讀取隱藏欄位發現版本衝突 → 回報錯誤
- 預設:偵測到衝突 → 散發代理停止套用該節點後續變更
三、啟用衝突偵測的方式
方式 1:預存程序 sp_addpublication (彈性最高)
- 可指定偵測到衝突時,散發代理是停止還是繼續套用
- 建議保持預設「停止套用」
方式 2:企業管理器 / 對等複寫拓撲精靈 (簡便但選項少)
- 「發行集屬性」→「訂閱選項」頁籤啟用
- 缺點:無法選擇衝突處理行為,強制停止套用
四、衝突發生後的處理流程
- 設定警示:啟用「對等衝突偵測」警示,郵件/訊息/事件記錄通知 DBA
- 決策處理模式:
- 預設:停止套用 — 保護資料一致性,需人工介入
- 替代:繼續套用 — 可能導致資料不一致,後續需在最高優先級節點手工修正再傳播
- 人工解決:分析衝突資料,於權威節點修正,重新同步
五、使用限制 (必須滿足)
- 所有參與複寫的可更新節點必須為 SQL Server 2008 (需升級舊版)
- 所有節點都必須啟用 衝突偵測,否則有漏網之魚
最佳實務建議
- 設計階段預評估衝突風險 (PK 設計、業務流程)
- 優先使用預存程序啟用,保留「停止/繼續」選擇權
- 必配警示機制,確保第一時間知情
- 建立衝突處理 SOP,明確權威節點與修正流程