表 A、表 B 結構不同,需雙向同步指定欄位(如 id、col1),避免觸發器遞迴死循環。
使用 @disable 旗標,同一會話內避免再次觸發。
-- 假設表結構
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 確保來源資料已落地| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 觸發器 | 資料庫層強一致、無應用改造 | 維護成本高、難偵錯、影響寫入延遲 | 少量核心表強一致 |
| 應用雙寫 | 邏輯可控、易測試 | 分散式事務複雜、需補償機制 | 微服務、跨庫同步 |
| CDC (Canal/Debezium) | 解耦、高效能、支援多下游 | 架構複雜、需運維 Kafka | 大規模異構同步 |
SHOW TRIGGERS、information_schema.TRIGGERS 防止殭屍觸發器觸發器同步雙刃劍,用好鎖變數防循環,用完即拆避技術債。