2011-02-02 3 views
2

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

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

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

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

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

Я останавливаю с $ кот CATALINA_HOME/бен/shutdown.sh

Энди

+0

Вы поняли это? Есть ли способ определить строку проблемы и вручную ее разблокировать? (Я думаю, что мы можем видеть подобную проблему) – chrishomer

+0

Нет, я видел это 3 раза в тестировании. Пока не понял. Факторы: (1) Я использую Lucene в том же процессе, и когда это происходит, Lucene также получает смертельный поврежденный мьютекс. (2) Кажется, происходит, когда я использую клиент mysql в другом процессе для запроса базы данных во время работы моего приложения. –

+0

Я знаю, что это старый вопрос, но вы еще это выяснили? Я думаю, что у меня есть аналогичная проблема, и я не мог ее исправить. – xycf7

ответ

0

MySQL не понимает, что сделка была прервана.

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

Смежные вопросы