gpt4 book ai didi

php - MySQL InnoDB 插入和选择锁

转载 作者:行者123 更新时间:2023-11-29 12:22:24 25 4
gpt4 key购买 nike

我创建了一个票务系统,其最简单的形式只是记录用户加入队列,并打印出带有队列号的票证。

当用户按下请求票时,数据库中会发生以下情况

INSERT details INTO All_Transactions_Table
SELECT COUNT(*) as ticketNum FROM All_Transactions_Table WHERE date is TODAY

在大多数情况下,这对我很有用。然而,我最近开始看到一些重复的票号。即使我自己多次运行网络服务,我似乎也无法复制该问题。

我对它如何发生的猜测是,在某些情况下,INSERT 仅在SELECT COUNT之后发生。但这是一个 InnoDB 表,我没有使用 INSERT DELAYED。 InnoDB 有这样的隐式机制吗?

最佳答案

我认为你的问题是你有竞争条件。想象一下,有两个人进来买票。这是第一个人:

INSERT details INTO All_Transactions_Table

然后,在 SELECT COUNT(*) 发生之前,第二个人出现并执行以下操作:

INSERT details INTO All_Transactions_Table

现在两个用户都获得相同的票号。使用现有代码很难复制这一点,因为它取决于 MySQL 线程的精确调度,而这完全超出了您的控制范围。

对此的最佳解决方案是使用某种AUTO_INCRMENT列来提供票号,但如果做不到这一点,您可能可以使用事务来实现您想要的:

START TRANSACTION
SELECT COUNT(*) + 1 as ticketNum FROM All_Transactions_Table WHERE date is TODAY FOR UPDATE
INSERT details INTO All_Transactions_Table
COMMIT

但是,这是否有效取决于您设置的事务隔离级别,并且效率不会很高。

关于php - MySQL InnoDB 插入和选择锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28826414/

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