jayxtt999 2015-10-14 01:33 采纳率: 0%
浏览 1057

mysql双向触发器怎么样避免死循环

情况大概是这样的,A表触发器触发B表的操作,同时B表的触发器也会触发A表操作。在只能用mysql处理的情况下,有什么好的办法避免死循环。

  • 写回答

1条回答

  • 混分吴老师 2023-04-07 20:09
    关注

    在 MySQL 中,双向触发器可能会导致死循环。为了避免这种情况,你可以使用用户定义的变量来跟踪触发器的执行状态。通过检查这个变量,你可以在触发器中包含一个条件来阻止死循环的发生。

    以下是避免死循环的步骤:

    1. 在每个触发器中创建一个用户定义的变量,例如 @disable_trigger
    2. 在触发器的执行语句之前,检查变量的值。如果变量的值为 TRUE,则跳过触发器的执行。
    3. 在触发器操作中,在可能导致死循环的操作之前,将变量设置为 TRUE,并在操作完成后将其设置回 FALSE

    以下是一个避免死循环的示例:

    首先,创建两个表 table1table2

    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 ;
    

    现在,当你更新 table1table2 时,触发器将不会导致死循环。用户定义的变量 @disable_trigger 用于控制触发器的执行,从而避免死循环。

    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大