Пессимистическая блокировка транзакции mysql повреждена

Я использую спящий режим, innodb и mysql. У меня есть пессимистическая блокировка (на определенную строку таблицы), полученная в начале очень длинной транзакции гибернации. Иногда, когда я запускаю программу, которая запускает эту транзакцию и работает в eclipse в автономном режиме приложения, и выполняю жесткую остановку приложения (что вызывает смерть потока), у меня возникает следующий сценарий:

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

Единственный способ заставить все снова работать - остановить демон MySQL и перезапустить его, после чего будет получена пессимистическая блокировка.

Это действительно беспокоит меня. Это означает, что любой выход из ВМ, кроме исключения или полного завершения работы, может оставить MySQL в неработоспособном состоянии, требующем перезапуска демона MySQL. например использует обычный способ выключения и перезапуска Tomcat, который, насколько я понимаю, включает смерть потока, точно так же, как использование eclipse для прерывания работающего приложения.

Сталкивались ли с этой проблемой другие люди? Есть ли чистый способ остановить tomcat, который не требует смерти потока? Разве MySQL не должен быть невосприимчив к смерти потока в середине транзакции, получившей пессимистическую блокировку (выбрать для обновления)?

Я останавливаю tomcat с помощью $CATALINA_HOME/bin/shutdown.sh

Энди


person Andy Nuss    schedule 02.02.2011    source источник
comment
Вы поняли это? Есть ли способ определить проблемную строку и разблокировать ее вручную? (Я думаю, что мы можем видеть аналогичную проблему)   -  person chrishomer    schedule 01.03.2011
comment
Нет, я видел это 3 раза в тестировании. Еще не разобрался. Факторы: (1) Я использую Lucene в том же процессе, и когда это происходит, Lucene также получает фатальный поврежденный мьютекс. (2) Кажется, это происходит, когда я использую клиент mysql в другом процессе для запроса базы данных во время работы моего приложения.   -  person Andy Nuss    schedule 05.03.2011
comment
Я знаю, что это старый вопрос, но вы уже поняли это? Я думаю, что у меня похожая проблема, и я не мог ее решить.   -  person xycf7    schedule 07.03.2012
comment
Я пришел к мнению, что дело было в запуске lucene и mysql в одном процессе (не очень хорошая идея). У меня также были бы повреждены замки Lucene. С тех пор, как я переместил lucene в другой процесс, используя сокеты, я не видел проблемы.   -  person Andy Nuss    schedule 08.03.2012


Ответы (1)


MySQL не понимает, что транзакция была прервана.

Я бы сказал, что вы недостаточно ждали, чтобы инициировать тайм-аут транзакции. В любой базе данных (и MySQL, конечно) вы можете указать время ожидания транзакции, которое откатит транзакцию, если она не будет зафиксирована до этого.

person jpkrohling    schedule 03.02.2011