我正在使用 hibernate、innodb 和 mysql。我在一个非常长的 hibernate 事务开始时获得了一个悲观锁(在特定的表行上)。有时,当我运行启动此事务的程序并以独立应用程序模式在 eclipse 中运行,并硬停止应用程序(这会强制线程死亡)时,我会遇到以下情况:
MySQL 没有意识到事务已中止。下次我运行我的应用程序时,获取悲观锁的函数(在那个长事务的开始)阻塞,即使 MySQL 应该意识到该行已解锁。
让事情重新开始工作的唯一方法是停止 MySQL 守护进程并重新启动它,然后获得悲观锁。
这真的让我很担心。这意味着除了异常或干净关闭之外的任何 VM 退出都可能使 MySQL 处于损坏状态,需要重新启动 MySQL 守护程序。例如正在使用正常的方式关闭并重新启动 Tomcat,在我的理解中,这涉及线程死亡,就像使用 eclipse 中止正在运行的应用程序一样。
其他人遇到过这个问题吗?有没有一种不涉及线程死亡的干净方法来停止tomcat?难道 MySQL 不应该在获得悲观锁(select for update)的事务中不受 threaddeath 的影响吗?
我正在使用 $CATALINA_HOME/bin/shutdown.sh 停止 tomcat
安迪
最佳答案
MySQL does not realize that the transaction was aborted.
我会说您没有等待足够长的时间来触发事务超时。在任何数据库(当然还有 MySQL)中,您可以指定事务超时,如果在此之前未提交事务,它将回滚事务。
关于mysql事务悲观锁损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4879795/