这令我感到困惑,希望有人可以提供帮助。
查询:
insert into `shelter_pages` (`userid`,`relid`)
select :userid, `id` from `shelter` where `stage`='egg' order by rand() limit 30
简单,对吧?取30个满足条件的随机行,并将它们保存在"页面中#34;表以及用户ID。
错误:
SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败(`db_name` .shelter_pages`,CONSTRAINT`shelter_pages_ibfk_2` FOREIGN KEY(`relid`)REFERENCES` shelter` (`id`)ON DELETE CASCADE ON UPDATE CASCADE)
那怎么可能呢?它确实在`shelter`.`id`
查询和SELECT
中获取了这些INSERT
值,外键检查如何可能失败?
如果它有任何意义,那么该表是相当繁忙的" - 它是游戏元素的一部分,任何玩家都可以采用"从避难所,从而删除行。在我认为原子操作中,这是否与竞争条件一样简单?
答案 0 :(得分:1)
这可能是因为您将transaction isolation level设置为"脏读" (即READ UNCOMMITTED
)。这意味着SELECT
可能正在读取未提交的数据,这些数据会在INSERT
期间使外键约束失败。