複寫選項規劃的重要性
SQL Server 2000 提供立即更新訂閱者、佇列更新、佇列更新做熱備援的立即更新等選項,允許在訂閱端修改資料並回寫發行端。這類雙向複寫大幅增加設定與管理複雜度,必須深入理解底層機制。
立即更新訂閱者運作原理
- 適用於快照式與交易式複寫(合併式複寫不支援)。
- 訂閱者修改資料時,透過兩階段認可 (2PC) 立即同步到發行者,確保發行者與該訂閱者交易一致性。
- 其他訂閱者則透過散發代理程式非同步接收變更,不參與 2PC,降低複雜度與失敗機率。
核心支援元件
- 觸發程序(訂閱端):攔截 DML,透過 RPC 呼叫發行端預存程序,參與 2PC。提交失敗則回滾,保持同步。
- 預存程序(發行端):每篇發行項建立 INSERT/UPDATE/DELETE 程序,檢查時間戳記偵測衝突,無衝突才套用變更。
- MS DTC (Microsoft Distributed Transaction Coordinator):管理訂閱者與發行者間的 2PC,遠端預存程序以
BEGIN DISTRIBUTED TRANSACTION 初始化。
- 衝突偵測:發行端比對時間戳記(
timestamp 欄位),若相同表示訂閱者讀取後未被修改,接受變更;否則拒絛並回滾。
- 迴路偵測:防止變更在多節點間循環複寫。
衝突偵測細節
訂閱者提交時送回所有欄位含 timestamp,發行端預存程序比對目前列的 timestamp:
- 相同 → 無衝突,用訂閱者值更新。
- 不同 → 已被他人修改,拒絕交易,雙端回滾。
實務提醒
- 立即更新需要穩定、低延遲的網路連線(2PC 同步階段會鎖定資源)。
- 大量更新或長時間交易會增加封鎖風險,評估改用佇列更新。
- 合併式複寫若需雙向寫入,請使用合併式內建衝突解決器,勿嘗試立即更新。