mysql事务悲观锁损坏

标签 mysql hibernate tomcat transactions pessimistic-locking

我正在使用 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/

相关文章:

mysql - AWS DynamoDB 表结构?

php - MySql 获取乱码结果

java - 根据存在的其他 validator 验证自定义 validator

java - Hibernate:用户类型与字段/属性访问

tomcat - 部署在 tomcat 服务器上的 Grails 应用程序的最佳 PermSize?

MySql 动态列名

mysql - 在 SELECT 中设置一个包含 2 个元素的 var

java - 在从 Spring MVC 作为 JSON 发送时动态忽略 Java 对象中的字段

java - Fuseki 服务器不显示数据集

java - Tomcat + CxF 准备好投入生产了吗?