【发布时间】:2025-12-06 07:35:01
【问题描述】:
在我的数据库 (MySQL) 中,我有一个表 (MyISAM),其中包含一个名为 number 的字段。该字段的每个值都是 0 或正数。非零值必须是唯一的。最后一件事是在我的 php 代码中根据该表中另一个字段(称为 isNew)的值生成该字段的值。代码如下。
$maxNumber = $db->selectField('select max(number)+1 m from confirmed where isNew = ?', array($isNew), 'm');
$db->query('update confirmed set number = ? where dataid = ?', array($maxNumber, $id));
第一行代码选择数字字段的最大值并将其递增。第二行通过设置新生成的数字来更新记录。
数百个客户同时使用此代码,因此我注意到有时会出现重复的数字字段。据我了解,当两个客户端几乎同时读取数字字段的值时会发生这种情况,而这一事实会导致重复。
我已经阅读了 SELECT ... FOR UPDATE 语句,但我不太确定它是否适用于我的情况。
所以问题是我应该只将 FOR UPDATE 附加到我的 SELECT 语句吗?或者创建一个存储过程来完成这项工作?或者可能完全改变生成数字的方式?
【问题讨论】:
-
可怕......只需使用 auto_increment int 并完成它。您的代码会受到竞争条件的影响,并且永远如此。
-
您是否有理由需要使用 MyISAM 作为您的表引擎?这对汽车公司来说很时髦,只会增加你的麻烦。首先重新考虑您的架构,然后制定您的计划。
-
auto_increment 不能使用,因为值是根据提到的其他字段生成的 (isNew)
标签: php mysql sql concurrency transactions