这是触发器:
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
答案 0 :(得分:2)
我认为单一操作 insert是原子的,表被锁定 交易正在进行中
两个表都被锁定(使用了MyISAM)或者记录可能被锁定(使用InnoDB),而不是两者都有。
既然你提到了“事务”,我认为InnoDB正在使用中。 InnoDB的一个优点是没有表锁,因此没有什么能阻止许多触发器的主体同时执行并产生相同的结果。