MySQL事务和触发器

时间:2010-11-15 12:42:11

标签: mysql sql stored-procedures triggers

嘿伙计们,这是我无法弄清楚的。我们在数据库中有一个表,其中PHP插入记录。我创建了一个触发器来计算要插入的值。计算出的值应该是唯一的。但是,有时会发生表格中几行的完全相同的数字。该数字是年,月和日的组合以及当天的订单数量。我认为insert的单个操作是原子的,并且在事务进行时表被锁定。我需要计算值是唯一的...服务器是版本5.0.88。服务器是带有双核处理器的Linux CentOS 5。

这是触发器:

CREATE TRIGGER bi_order_data BEFORE INSERT ON order_data
FOR EACH ROW BEGIN
  SET NEW.auth_code = get_auth_code();
END;

相应的例程如下:

CREATE FUNCTION `get_auth_code`() RETURNS bigint(20)
BEGIN
    DECLARE my_auth_code, acode BIGINT;
    SELECT MAX(d.auth_code) INTO my_auth_code
        FROM orders_data d
        JOIN orders o ON (o.order_id = d.order_id)
        WHERE DATE(NOW()) = DATE(o.date);

    IF my_auth_code IS NULL THEN
        SET acode = ((DATE_FORMAT(NOW(), "%y%m%d")) + 100000) * 10000 + 1;
    ELSE
        SET acode = my_auth_code + 1;
    END IF;
    RETURN acode;
END

1 个答案:

答案 0 :(得分:2)

  我认为单一操作   insert是原子的,表被锁定   交易正在进行中

两个表都被锁定(使用了MyISAM)或者记录可能被锁定(使用InnoDB),而不是两者都有。

既然你提到了“事务”,我认为InnoDB正在使用中。 InnoDB的一个优点是没有表锁,因此没有什么能阻止许多触发器的主体同时执行并产生相同的结果。