MySQL插入:竞争条件

时间:2016-08-17 13:39:04

标签: mysql database insert race-condition composite-primary-key

我想知道是否存在一个真实案例场景,其中在插入查询中实际上可能发生竞争条件问题。所以我有一个表“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约束是否会改变我面临的场景以及为什么会发生这种情况。

1 个答案:

答案 0 :(得分:0)

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