Ограничения внешнего ключа MySQL выбрасывают ActiveRecord :: StatementInvalid (Тайм-аут ожидания блокировки) в моем приложении Rails 3.1 - PullRequest
4 голосов
/ 26 февраля 2012
**Software Versions:**

Rails 3.1.3
MySQL 5.5.21
OS: MacOS 10.7.3

Сегодня я добавил множество ограничений внешнего ключа с помощью гема иностранца в мою базу данных MySQL.Но теперь я получаю исключения «Блокировка ожидания ожидания» на простых вставках:

ActiveRecord::StatementInvalid (Mysql2::Error: Lock wait timeout exceeded; 
try restarting   transaction

Если я удаляю ограничения внешнего ключа из моей БД, проблема исчезает.

Проблема возникает, когда я пытаюсьдобавить объект с данными для ассоциации has_one с «accepts_nested_attributes_for":

class MyApp::PrimaryData < ActiveRecord::Base
    has_one :sub_data, :dependent => :destroy
    accepts_nested_attributes_for :sub_data
    [...]
end

class MyApp::SubData < ActiveRecord::Base
    belongs_to :primary_data
    attr_accessible :field1, :field2
    [...]
end

table: primary_data
-------------------
- id (integer)
- field1 (string)
  [...]


table: sub_data
---------------
- id (integer)
- primary_data_id (integer)
- field1 (string)
- field2 (string)
  [...]

-> foreign_key_contraint on primary_data_id --> table primary_datas (id)

Если я просто создаю «PrimaryData» без «SubData» или «PrimaryData»"и" SubData "отдельно, тогда я не получаю никаких ошибок MySQL, только когда я пытаюсь создать" PrimaryData "с некоторыми" SubData "через Rails" acceptpts_nested_attributes_for ".

Кто-нибудь может мне помочь сЭта проблема?Заранее спасибо.

1 Ответ

0 голосов
/ 15 декабря 2012

Это тупик.

Когда вы добавляете строку в таблицу с ограничением внешнего ключа, MySQL получит блокировку как для этой таблицы (или строки в случае InnoDB), так и для ссылочной таблицы (или строки в случае InnoDB).

В этом конкретном случае, когда вы создаете PrimaryData с SubData, MySQL сначала получает блокировку для primary_data, затем на sub_data, а затем мертвые блокировки при получении другой блокировки на primary_data.

В общем, использование внешних ключей с рельсами не очень хорошая идея. Используйте для этих целей активные средства проверки записей.

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