MySQL Внешние ограничивающие несоответствия - PullRequest
0 голосов
/ 09 февраля 2012

У нас странные ошибки в нашей производственной среде.

Ошибка:

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 и внешних ключей у меня было несколько предположений.

  1. стол был заблокирован. Я использовал cli, чтобы сделать это вручную через блокировку / разблокировку таблиц в середине транзакции, однако он просто терпеливо ждал, пока таблица не будет разблокирована и завершена ... так что не стоит.

  2. поэтому document_version ссылается на документ, который должен быть уникальным. Возможно, две транзакции одновременно пытаются вставить один и тот же документ, и mysql выдаст разные идентификаторы. Это означало бы, что все будет работать нормально, но вторая транзакция будет пытаться завершиться, но документ не сможет выполнить ограничения уникального ключа, что сделает document_id недействительным? Таким образом, не хватает внешнего ключа? Я снова повторил это через cli, запустив 2 транзакции и позволив им вставить одну и ту же строку в документ. Снова mysql терпеливо ждал транзакции # 2, пока 1-я транзакция не завершилась, прежде чем позволить ей продолжить и допустить ошибку. Не проблема.

Я в растерянности. Любые идеи приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...