如何避免锁定等待超时超出exception。

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 

我更新记录时,我的重复锁超时超出exception。

我正在使用Java Struts 2.1 Hibernate配置。 DB Used是MYSQL。

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

以下是一些建议:

  1. 锁定等待超时 ”通常发生在事务正在等待要更新的数据行时,这些行已被某些其他事务锁定。
  2. 大多数时候,问题出在数据库方面。 可能的原因可能是不适当的表格设计,大量数据,约束等。
  3. 请查看这个精心解答的答案 。

确保数据库表使用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获取帮助。

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

谢谢。

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

 @Transactional(propagation = Propagation.REQUIRES_NEW) 

(恭敬地忽略了DB特定的答案)

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

通常, CRUD界面具有共享公共私有方法的公共 “创建”,“读取”,“更新”和“删除”方法。 这是为了DRY最佳实践。 然而,在这样做的过程中,这些方法在大多数情况下都能完美运行,但并非始终如此。

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

确保:

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

    (重要!)焦点测试案例:

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

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

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

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