我们的生产环境出现了奇怪的错误。
错误是:
MySQLIntegrityConstraintViolationException:
Cannot add or update a child row:
a foreign key constraint fails
('MSeHA_BARTLETT'.'document_version',
CONSTRAINT 'document_version_ibfk_1'
FOREIGN KEY ('document_id')
REFERENCES 'document' ('id')
ON DELETE CASCADE ON UPDATE CASCADE).
On SQL:
INSERT INTO 'document_version' SET
'document_id'='2002069',
'type_id'='2',
'subtype_id'='119091',
'status_id'='4',
'event_timestamp'='2012-02-08 15:02:00',
'provider_id'='1056'
ON DUPLICATE KEY UPDATE
'id'=LAST_INSERT_ID('id') ,
'type_id'='2',
'subtype_id'='119091',
'status_id'='4',
'provider_id'='1056'
凭借我对mysql和外键的了解,我有一些假设。
桌子已被锁定。我使用cli手动通过锁定/解锁表中间事务来执行此操作,但它只是耐心等待,直到桌子解锁并完成...所以不要去。
所以document_version引用的文档必须是唯一的。也许2个事务同时尝试插入相同的文件,而mysql会返回不同的ID。 Thsi意味着一个工作正常,但第二个事务将尝试完成,但文档将失败唯一键约束,使document_id无效?因此外键失败了吗?同样,我通过启动2个事务重新通过cli实现了这个,并让它们都将同一行插入到文档中。同样,mysql耐心地等待事务#2,直到第一个事务完成,然后让它继续并且出错。不是问题。
我很茫然。任何想法都表示赞赏。