21
    java.sql.SQLException: Lock wait timeout exceeded; try restarting tra
nsaction at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.ja
va:2077)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:
2228)
        at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:
208)
        at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
        at org.hibernate.loader.Loader.doQuery(Loader.java:697)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Lo
ader.java:259)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:1885)
        ... 131 more

更新记录时,我收到重复的锁定超时超出异常。

我正在使用 Java Struts 2.1 Hibernate 配置。使用的数据库是 MYSQL。

任何人都知道如何解决它..??

4

7 回答 7

21

以下是一些建议:

  1. “<strong>锁定等待超时”通常发生在事务正在等待更新已被其他事务锁定的数据行时。
  2. 大多数时候,问题出在数据库方面。可能的原因可能是不适当的表设计、大量数据、约束等。
  3. 请查看这个详尽的答案
于 2012-12-20T07:40:32.050 回答
6

这也可能是由以下注释的滥用引起的,就像在这篇StackOverflow 文章中一样:

@Transactional(propagation = Propagation.REQUIRES_NEW)
于 2016-11-14T10:12:18.373 回答
5

确保数据库表使用 InnoDB 存储引擎和 READ-COMMITTED 事务隔离级别。

您可以SELECT @@GLOBAL.tx_isolation, @@tx_isolation;在 mysql 控制台上进行检查。

如果未设置为 READ-COMMITTED,则必须设置它。在设置它之前,请确保您在 mysql 中具有 SUPER 权限。

您可以从http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html 获得帮助。

通过设置这个我认为你的问题会得到解决。

谢谢你。

于 2015-01-23T12:31:37.190 回答
1

(恭敬地忽略数据库特定的答案)

当使用正式的CRUD模式和通过 Singleton 类引导的所有数据库流量时,您仍然会遇到线程锁定。这通常是由于您自己、大学和 Hibernate 团队之间的疏忽而发生的。因此,检查自己的代码是否有错误是最快的——特别注意hibernate 的核心规则。

通常,CRUD接口具有共享公共私有方法的公共“创建”、“读取”、“更新”和“删除”方法。这样做是为了DRY最佳实践。但是,在这样做的过程中,这些方法在大多数情况下都可以完美运行,但并非所有时间。

那么,如何测试和解决线程锁定呢?

确保:

  • session.save(myObj)行动首先检查PK的唯一性
  • 所有uniqueResult()查询确实返回 1 个结果,并且;

    (重要!)关注测试用例:

    • 引入PK重复
    • 更新/读取/删除不存在的记录/条目/行

最后,使用@AfterSuite( TestNG ) 删除所有表条目。任何不充分的实现都会在上述操作上产生另一个线程锁......否则,你就是黄金。

于 2015-05-22T10:44:38.977 回答
1

删除@Transactional(propagation = Propagation.REQUIRES_NEW)并检查。它会工作

于 2020-11-24T18:52:33.703 回答
0

检查您的 where 子句是否已优化.. 即使用主键和/或索引

于 2015-07-29T18:21:07.000 回答
0

如果以上所有方法都不起作用,请检查 mysql 日志中的错误消息。如果提到日志文件的大小,你需要在配置中增加它并重启mysql服务器。

于 2017-01-03T17:13:50.977 回答