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 用于控制触发器的执行,从而避免死循环。

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!