0

我发生 Lock wait timeout exceeded 错误。以下是例外:

org.springframework.dao.CannotAcquireLockException: 
### Error updating database.  Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
### The error may involve commManager.updateOrderHotelInfo-Inline
### The error occurred while setting parameters
### Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
; SQL []; Lock wait timeout exceeded; try restarting transaction; nested exception is java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
 at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:261)
 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
 at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
 at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)
 at $Proxy21.update(Unknown Source)
 at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:246)

春季交易配置 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>

使用Spring注解@Transactional,它会抛出异常。但是更改为@Transactional(propagation=Propagation.REQUIRES_NEW),就可以了。

我在 MySqlServer 上执行 show engine innodb status \G ,输出这些:--TRANSACTION 107D2F81, ACTIVE 18 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 5 lock struct(s), heap size 1248, 3 row lock( s),撤消日志条目 1 MySQL 线程 id 23795,操作系统线程句柄 0x50e8a940,查询 id 207416339 192.168.126.236 ppb 更新 UPDATE Commission_order_hotel_info_ext SET audit_tel = '0898-88350052',

            global_commission_percent = 10.00,


            guarantee = '{\"type\":\"none\"}' 
    WHERE
        hotel_id = 10190

Trx 读取视图将看不到 id >= 107D2F82 的 trx,看到 < 107D1795 ------- TRX 已等待 18 秒以获得此锁定:

记录锁定空间 id 3123 页号 3 n 位 128PRIMARY表索引hmscommission_order_hotel_info_exttrx id 107D2F81 lock_mode X 等待

表锁表hmsorder_hotel_infotrx id 107D2F81 锁定模式 IX RECORD LOCKS 空间 id 2874 页号 16 n 位 1272uniq_hotel_id表索引hmsorder_hotel_infotrx id 107D2F81 lock_mode X 锁定 rec 但不锁定间隙 RECORD LOCKS 空间 id 2874 页号 6 n 位 184PRIMARY表索引hmsorder_hotel_infotrx id 107D2F81 lock_mode X 锁定rec 但不锁定间隙TABLE LOCK 表hmscommission_order_hotel_info_exttrx id 107D2F81 锁定模式 IX RECORD LOCKS 空间 id 3123 页号 3 n 位 128PRIMARY表索引hmscommission_order_hotel_info_exttrx id 107D2F81 lock_mode X waiting ---TRANSACTION 107D1795, ACTIVE 845 sec 5 lock struct(s), heap size 1248, 59 row lock(s), undo log entries 2 MySQL thread id 23819, OS thread handle 0x50dc7940, query id 207389624 192.168.126.83 ppb Trx 读取视图将看不到 id >= 107D1796 的 trx,看到 <107D1796 TABLE LOCK 表hmsorder_hotel_infotrx id 107D1795 锁定模式 IX RECORD LOCKS 空间 id 2874 页号 16 n 位 1272uniq_hotel_id表索引hmsorder_hotel_infotrx id 107D1795 lock_mode X 锁定 rec 但不锁定间隙 RECORD LOCKS 空间 id 2874 页号 44 n 位 232PRIMARY表索引hmsorder_hotel_infotrx id 107D1795 lock_mode X 锁定记录但不锁定间隙表锁定表hmscommission_order_hotel_info_exttrx id 107D1795 锁定模式 IX RECORD LOCKS 空间 id 3123 页号 3 n 位 128PRIMARY表索引hms. commission_order_hotel_info_exttrx id 107D1795 lock_mode X

什么步骤来解决它

4

1 回答 1

7

该问题是由于连接无法锁定数据库中的行所致。这是由于另一个事务在同一行上的锁定时间过长,以至于您的事务在等待它完成并解锁该行时超时。包含当时的配置、代码和数据库服务器日志会对您有所帮助,以便我们确定问题出在哪里;因为这可能不是由您的代码引起的问题,而是另一个应用程序未按应有的方式释放其锁定的问题。

您对 @Transactional(propagation=Propagation.REQUIRES_NEW) 使您的代码工作的评论将表明先前的事务(可能是由您的方法链建立的一个事务)没有按应有的方式释放锁。

同样,包括您的代码和配置。我看到您从 XML 中包含了您的 transactionManager bean 声明。但是这一次,实际上包括了您的代码、您的完整数据源以及方法链配置中涉及的 bean。我知道包含所有代码似乎很有效,但是如果您需要帮助,我们需要信息。在这种情况下,信息永远不会太多。如果您想要一个如何提出好问题的示例,请查看我的示例。

于 2012-10-11T13:49:38.213 回答