MySQL 插入:竞争条件
MySQL Insertion: Race condition
我想知道是否存在插入查询实际上会发生竞争条件问题的真实案例场景。所以我有一个 table "User" 包含以下字段:
User:
iduser | idcompany | name | email
我为此 table 使用复合主键,即 (iduser, idcompany)。这些字段中的 None 设置为 AUTO_INCREMENT。我通过会话变量获取字段 "idcompany" 的值,所以这不是真正的问题。但是,我使用 getNextUserId() 函数通过 select 查询获取下一个有效的 iduser 值,如下所示:
SELECT MAX(iduser) + 1 AS next_iduser FROM User WHERE idcompany = {myCompanyId};
我想知道是否存在由于竞争条件而将 (iduser, idcompany) 的重复组合插入数据库的情况,如果是这样,这种情况怎么可能发生。 MySQL 不会在插入时锁定 table 吗? (iduser, idcompany) 的重复组合不会被拒绝,或者我真的可以在我的 table 中有一个重复的主键吗?我知道完全防止竞争条件的策略,例如使用 AUTO_INCREMENT 主键,使用 SQL 事务或手动锁定 "User" table 但我想了解背后的机制在这种情况下可能的竞争条件以及此实现中的真正问题是什么。现在,由于显而易见的原因,这些字段中的 none 在我的 table 中必须是唯一的,但我想知道例如对 iduser 的 UNIQUE 约束是否会改变我面临的场景以及为什么这会发生吗?
您写道您在 iduser、idcompany 字段上有一个复合主键。此约束将防止 table 具有重复的 iduser、idcompany 对。没有锁定可能发生的最坏情况是违反主键将阻止创建用户。
我想知道是否存在插入查询实际上会发生竞争条件问题的真实案例场景。所以我有一个 table "User" 包含以下字段:
User:
iduser | idcompany | name | email
我为此 table 使用复合主键,即 (iduser, idcompany)。这些字段中的 None 设置为 AUTO_INCREMENT。我通过会话变量获取字段 "idcompany" 的值,所以这不是真正的问题。但是,我使用 getNextUserId() 函数通过 select 查询获取下一个有效的 iduser 值,如下所示:
SELECT MAX(iduser) + 1 AS next_iduser FROM User WHERE idcompany = {myCompanyId};
我想知道是否存在由于竞争条件而将 (iduser, idcompany) 的重复组合插入数据库的情况,如果是这样,这种情况怎么可能发生。 MySQL 不会在插入时锁定 table 吗? (iduser, idcompany) 的重复组合不会被拒绝,或者我真的可以在我的 table 中有一个重复的主键吗?我知道完全防止竞争条件的策略,例如使用 AUTO_INCREMENT 主键,使用 SQL 事务或手动锁定 "User" table 但我想了解背后的机制在这种情况下可能的竞争条件以及此实现中的真正问题是什么。现在,由于显而易见的原因,这些字段中的 none 在我的 table 中必须是唯一的,但我想知道例如对 iduser 的 UNIQUE 约束是否会改变我面临的场景以及为什么这会发生吗?
您写道您在 iduser、idcompany 字段上有一个复合主键。此约束将防止 table 具有重复的 iduser、idcompany 对。没有锁定可能发生的最坏情况是违反主键将阻止创建用户。