如何避免锁定等待超时超出异常.

Dil*_*eep 17 java mysql hibernate

    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
Run Code Online (Sandbox Code Playgroud)

当我更新记录时,我正在重复锁定超时超出异常.

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

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

San*_*osh 19

以下是一些建议:

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

  • 但是如果问题出在你的表设计和大数据等方面,问题就会重新出现。 (2认同)

mar*_*kas 6

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

@Transactional(propagation = Propagation.REQUIRES_NEW)
Run Code Online (Sandbox Code Playgroud)


小智 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获取帮助.

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

谢谢.