2

我正在使用休眠、innodb 和 mysql。我在一个非常长的休眠事务开始时获得了一个悲观锁(在特定的表行上)。有时,当我运行启动此事务的程序并在 Eclipse 中以独立应用程序模式运行,并硬停止应用程序(这会强制线程死亡)时,我会遇到以下情况:

MySQL 没有意识到事务已中止。下次我运行我的应用程序时,获得悲观锁(在那个长事务开始时)的函数会阻塞,即使 MySQL 应该意识到该行已解锁。

让事情再次运行的唯一方法是停止 MySQL 守护程序并重新启动它,然后获得悲观锁。

这真的让我很担心。这意味着除异常或完全关闭之外的任何 VM 退出都可能使 MySQL 处于需要重新启动 MySQL 守护程序的损坏状态。一个例子是使用正常的方式关闭和重新启动 Tomcat,在我的理解中涉及线程死亡,就像使用 eclipse 中止正在运行的应用程序一样。

其他人遇到过这个问题吗?有没有一种干净的方法来停止不涉及线程死亡的tomcat?MySQL不应该在获得悲观锁(选择更新)的事务中间免受线程死亡的影响吗?

我正在使用 $CATALINA_HOME/bin/shutdown.sh 停止 tomcat

安迪

4

1 回答 1

0

MySQL 没有意识到事务已中止。

我会说你没有等待足够的时间来触发事务超时。在任何数据库(当然还有 MySQL)中,您可以指定事务超时,如果在此之前未提交事务,它将回滚事务。

于 2011-02-03T07:29:00.043 回答