情况大概是这样的,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无用 - 在每个触发器中创建一个用户定义的变量,例如
悬赏问题
- ¥30 这是哪个作者做的宝宝起名网站
- ¥60 版本过低apk如何修改可以兼容新的安卓系统
- ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
- ¥50 有数据,怎么建立模型求影响全要素生产率的因素
- ¥50 有数据,怎么用matlab求全要素生产率
- ¥15 TI的insta-spin例程
- ¥15 完成下列问题完成下列问题
- ¥15 C#算法问题, 不知道怎么处理这个数据的转换
- ¥15 YoloV5 第三方库的版本对照问题
- ¥15 请完成下列相关问题!