情况大概是这样的,A表触发器触发B表的操作,同时B表的触发器也会触发A表操作。在只能用mysql处理的情况下,有什么好的办法避免死循环。
在 MySQL 中,双向触发器可能会导致死循环。为了避免这种情况,你可以使用用户定义的变量来跟踪触发器的执行状态。通过检查这个变量,你可以在触发器中包含一个条件来阻止死循环的发生。
以下是避免死循环的步骤:
@disable_trigger
。TRUE
,则跳过触发器的执行。TRUE
,并在操作完成后将其设置回 FALSE
。以下是一个避免死循环的示例:
首先,创建两个表 table1
和 table2
:
CREATE TABLE table1 (
id INT PRIMARY KEY AUTO_INCREMENT,
value INT
);
CREATE TABLE table2 (
id INT PRIMARY KEY AUTO_INCREMENT,
value INT
);
创建触发器 tr_table1_after_update
:
DELIMITER //
CREATE TRIGGER tr_table1_after_update
AFTER UPDATE ON table1
FOR EACH ROW
BEGIN
IF @disable_trigger IS NULL OR @disable_trigger = FALSE THEN
SET @disable_trigger = TRUE;
UPDATE table2 SET value = NEW.value WHERE id = OLD.id;
SET @disable_trigger = FALSE;
END IF;
END; //
DELIMITER ;
创建触发器 tr_table2_after_update
:
DELIMITER //
CREATE TRIGGER tr_table2_after_update
AFTER UPDATE ON table2
FOR EACH ROW
BEGIN
IF @disable_trigger IS NULL OR @disable_trigger = FALSE THEN
SET @disable_trigger = TRUE;
UPDATE table1 SET value = NEW.value WHERE id = OLD.id;
SET @disable_trigger = FALSE;
END IF;
END; //
DELIMITER ;
现在,当你更新 table1
或 table2
时,触发器将不会导致死循环。用户定义的变量 @disable_trigger
用于控制触发器的执行,从而避免死循环。