mysql触发器的锁

时间:2016-03-13 13:41:14

标签: mysql sql database triggers locks

我的mysql数据库中的表上有一个BEFORE INSERT触发器。它的作用是:

  1. 从当前表中选择一些条目。
  2. 使用new.columnname
  3. 将它们与要插入的值匹配
  4. 如果在值之间发现重叠,请通过以下方式取消INSET查询:

    设置msg =“预订已存在”; signal sqlstate'45000'SET MESSAGE_TEXT = msg;

  5. 如果未找到重叠,请让查询完成。

  6. 然而,触发器不起作用,因为我预期它在非常罕见的情况下,它忽略了重叠值。我能想到的唯一可能的情况是:

    1. 正在执行两个具有重叠值的INSERT查询,它们之间存在微秒的时间差。
    2. 第一个触发器运行并在表上​​为SELECT值创建一个READ锁。没有找到重叠,因此它释放READ锁并创建一个WRITE锁,因此它现在可以完成INSERT查询。同时,第二个触发器为SELECT值创建READ锁定并选择现有值。第一个触发器尚未在表中写入其值。
    3. 然后,第一个触发器将其值写入表中。然后第二个触发器写入其值,因为它没有发现任何重叠。
    4. 我已经通过多次同时运行两个这样的查询进行了测试,但直到现在还发生了一次。但它仍然有,所以我需要一种方法来确保它永远不会再发生。

      我认为一种可能的情况是在运行INSERT查询之前显式锁定表。

      因此交易将如下所示:

      LOCK TABLE t WRITE;
      LOCK TABLE t READ;
      INSERT INTO t ....;
      UNLOCK TABLE t;
      

      在这种情况下,我的问题是:

      如果现在我同时执行此事务,第二个会排队还是返回错误?

      任何输入都会有所帮助。谢谢!

0 个答案:

没有答案