大家好,我不知道这是哪一个。我们在数据库中有一个表,PHP在其中插入记录。我创建了一个触发器来计算要插入的值。计算值应该是唯一的。但是,有时表中的几行有完全相同的数字。该数字是年,月和日以及该天的订单号的组合。我认为插入的单个操作是原子的,并且在进行事务时表被锁定。我需要计算出的值是唯一的...服务器是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

最佳答案

我以为
  插入是原子的,表已锁定
  在交易进行中


要么表被锁定(使用MyISAM),要么记录被锁定(使用InnoDB),但不能两者都被锁定。

由于您提到了“事务”,因此我假设正在使用InnoDB。
InnoDB的优点之一是没有表锁,因此没有什么可以阻止许多触发器的主体同时执行并产生相同的结果。

07-24 20:04