情况大概是这样的,A表触发器触发B表的操作,同时B表的触发器也会触发A表操作。在只能用mysql处理的情况下,有什么好的办法避免死循环。
1条回答
- 混分吴老师 2023-04-07 20:09关注
在 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
用于控制触发器的执行,从而避免死循环。解决 1无用 - 在每个触发器中创建一个用户定义的变量,例如