我想知道是否存在一个实际情况,其中在插入查询中实际上可能发生竞争条件问题。所以我有一个表“ User”,其中包含以下字段:

User:
iduser | idcompany | name | email


我为此表使用了一个复合主键,即(iduser,idcompany)。这些字段均未设置为AUTO_INCREMENT。我通过会话变量获取“ idcompany”字段的值,因此这并不是一个真正的问题。但是,我使用getNextUserId()函数通过如下所示的选择查询来获取下一个有效的iduser值:

SELECT MAX(iduser) + 1 AS next_iduser FROM User WHERE idcompany = {myCompanyId};


我想知道是否由于种族原因可以在数据库中插入重复的(iduser,idcompany)组合,如果有的话,这种情况怎么可能。 MySQL不会在插入时锁定表吗?是不是不会简单地拒绝(iduser,idcompany)的重复组合,或者我的表中确实有重复的主键?我知道可以完全防止出现竞争情况的策略,例如使用AUTO_INCREMENT主键,使用SQL事务或手动锁定“用户”表,但是我想了解这种情况下可能出现竞争情况的机制以及真正的问题是此实现。现在,出于明显的原因,这些字段都不要求在我的表中唯一,但是我想知道例如对iduser的UNIQUE约束是否会改变我面临的情况以及为什么会发生这种情况。

最佳答案

您写了在iduser,idcompany字段上有一个复合主键。此约束将防止表具有重复的iduser,idcompany对。没有锁定就可能发生的最糟糕的情况是,违反主键将阻止用户的创建。

关于mysql - MySQL插入:竞争条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38998297/

10-10 08:05