как решить lock_wait_timeout, последующий откат и исчезновение данных из MySQL 5.1.38 - PullRequest
1 голос
/ 09 ноября 2009

Я использую toplink со структурами 2 и toplink для приложения с высокой нагрузкой, приложение всегда обращается к одной таблице с несколькими операциями чтения и записи в секунду. Это вызывает ошибку lock_wait_timeout, и транзакция откатывается, в результате чего только что введенные данные исчезают из внешнего интерфейса. (Autocommit Mysql был установлен на один). Исключение было перехвачено и отправлено на страницу ошибки в приложении, но все же происходит откат (это должно быть исключение верхней ссылки, поскольку в mysql не включена функция отката). Файлы необработанных данных, ibdata01, показывают запись в нем при открытии в редакторе. Поскольку это случалось нечасто, не удалось воспроизвести в условиях испытаний.

Кто-нибудь может быть достаточно любезен, чтобы предоставить какой-то выход из этой дилеммы? Какой подход должен иметь такой высокий доступ (постоянное чтение и запись из одной и той же таблицы все время)? Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 09 мая 2011

Какова природа ваших одновременных чтений / обновлений? Вы постоянно обновляете одни и те же строки из разных сеансов? Что вы ожидаете, если две сессии обновят одну и ту же строку одновременно?

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

Если у вас несколько конфликтующих записей, вы можете рассмотреть возможность использования пессимистической блокировки для обеспечения успеха каждой транзакции. Но в любом случае у вас будет много споров, поэтому вы можете пересмотреть модель данных или использование данных приложением.

См http://en.wikibooks.org/wiki/Java_Persistence/Locking

0 голосов
/ 09 ноября 2009

lock_wait_timeouts - факт жизни для транзакционных баз данных. нормальный ответ обычно должен заключаться в том, чтобы перехватить ошибку и попытаться повторно выполнить транзакцию. не многие разработчики, кажется, понимают это, поэтому стоит повторить: если вы получили ошибку lock_wait_timeout и по-прежнему хотите зафиксировать транзакцию, запустите ее снова.

другие вещи, на которые стоит обратить внимание:

  • постоянные соединения, а не ЯВЛЯЮТСЯ транзакции приводят к длительным транзакции, которые приводят к ненужные замки.
  • так как ты отключить автоматическую фиксацию при входе в систему из MySQL CLI (или любой другой интерактивный инструмент запросов) и начать выполнение запросов вы стоите значительный шанс блокировки строк и не выпуская их своевременно образом.
...