gpt4 book ai didi

MySQL事务和触发器

转载 作者:行者123 更新时间:2023-11-29 09:16:03 26 4
gpt4 key购买 nike

嘿伙计们,这是一个我无法弄清楚的问题。我们在数据库中有一个表,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

最佳答案

I thought that single operation of insert is atomic and table is locked while transaction is in progress

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

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

关于MySQL事务和触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4184408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com