首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 觸發器實現雙表資料同步:防死循環完整範例

     編輯:MySQL 資料庫相關知識

場景

表 A、表 B 結構不同,需雙向同步指定欄位(如 id、col1),避免觸發器遞迴死循環。

核心技巧:會話變數鎖

使用 @disable 旗標,同一會話內避免再次觸發。

完整 DDL

-- 假設表結構
CREATE TABLE table_a (id INT PRIMARY KEY, col1 VARCHAR(50), col2 INT);
CREATE TABLE table_b (id INT PRIMARY KEY, col1 VARCHAR(50), col3 DATE);

-- 表 A → 表 B
CREATE TRIGGER trg_a2b_after_insert
AFTER INSERT ON table_a
FOR EACH ROW
BEGIN
  IF @disable IS NULL OR @disable = 0 THEN
    SET @disable = 1;
    INSERT IGNORE INTO table_b (id, col1) VALUES (NEW.id, NEW.col1);
    SET @disable = 0;
  END IF;
END;

-- 表 B → 表 A
CREATE TRIGGER trg_b2a_after_insert
AFTER INSERT ON table_b
FOR EACH ROW
BEGIN
  IF @disable IS NULL OR @disable = 0 THEN
    SET @disable = 1;
    INSERT IGNORE INTO table_a (id, col1) VALUES (NEW.id, NEW.col1);
    SET @disable = 0;
  END IF;
END;

關鍵點解析

  • INSERT IGNORE:主鍵衝突時靜默忽略,不報錯、不回滾
  • @disable 為使用者定義會話變數,生命週期 = 連線,天然隔離併發
  • AFTER INSERT 確保來源資料已落地
  • 若需同步 UPDATE/DELETE,另建對應觸發器,邏輯同理

替代方案對比

方案優點缺點適用場景
觸發器資料庫層強一致、無應用改造維護成本高、難偵錯、影響寫入延遲少量核心表強一致
應用雙寫邏輯可控、易測試分散式事務複雜、需補償機制微服務、跨庫同步
CDC (Canal/Debezium)解耦、高效能、支援多下游架構複雜、需運維 Kafka大規模異構同步

生產環境建議

  1. 優先考慮 CDC 架構,觸發器僅作為極少量表的戰術補丁
  2. 觸發器必須納入版本控制,變更走 Code Review
  3. 監控 SHOW TRIGGERS、information_schema.TRIGGERS 防止殭屍觸發器
  4. 壓測驗證寫入延遲增量 < 5ms

觸發器同步雙刃劍,用好鎖變數防循環,用完即拆避技術債。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved