2011-02-02 89 views
2

我正在使用hibernate,以及innodb和mysql。我在一個非常長的hibernate事務開始時獲得了悲觀鎖(在特定的錶行上)。有時候,當我運行啓動這個事務的程序,並在獨立應用程序模式下運行在eclipse中,並且強制停止應用程序(強制執行一個threaddeath)時,我有以下情形:mysql事務悲觀鎖已損壞

MySQL意識到交易被中止了。下一次運行我的應用程序時,即使MySQL應該意識到該行已解鎖,獲取悲觀鎖(在該長事務開始時)的函數也會被阻止。

讓事情重新開始的唯一方法是停止MySQL守護進程並重新啓動它,之後獲得悲觀鎖。

這真的讓我擔心。這意味着除了異常或乾淨關閉以外的任何VM退出都可能使MySQL處於斷開狀態,需要重新啓動MySQL守護進程。例如,正在使用正常的方式來關閉和重新啓動Tomcat,這在我的理解中涉及到一個線程死亡,就像使用eclipse來中止正在運行的應用程序一樣。

有其他人遇到此問題嗎?有沒有一種乾淨的方式來阻止不涉及threaddeath的tomcat?在獲得悲觀鎖的事務中選擇更新時,MySQL是否應該免於線程死鎖?

我停止Tomcat與$ CATALINA_HOME /斌/ shutdown.sh

安迪

+0

你知道了嗎?有沒有辦法確定問題行並手動解鎖? (我想我們可能會看到類似的問題) – chrishomer 2011-02-28 22:25:26

回答

0

MySQL不知道該交易被中止。

我想說,你沒有足夠的時間來觸發事務超時。在任何數據庫(特別是MySQL)中,您都可以指定一個事務超時,如果在此之前沒有提交,則會回滾該事務。