超过锁定等待超时;尝试重新启动交易[关闭]
Posted
技术标签:
【中文标题】超过锁定等待超时;尝试重新启动交易[关闭]【英文标题】:Lock wait timeout exceeded; try restarting transaction [closed] 【发布时间】:2012-10-11 13:36:54 【问题描述】:我发生 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 秒开始索引读取 mysql 表正在使用 1,锁定 1 LOCK WAIT 5 锁结构,堆大小 1248,3 行锁,撤消日志条目 1 MySQL 线程 id 23795,OS 线程句柄 0x50e8a940,查询 id 207416339 192.168.126.236 ppb 更新中 更新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,看到
记录锁空间 id 3123 页号 3 n 位 128 索引 PRIMARY
表 hms
.commission_order_hotel_info_ext
trx id 107D2F81 lock_mode X 等待
TABLE LOCK 表hms
.order_hotel_info
trx id 107D2F81 锁定模式IX
记录锁空间 id 2874 页号 16 n 位 1272 索引 uniq_hotel_id
表 hms
.order_hotel_info
trx id 107D2F81 lock_mode X 锁定记录但不锁定间隙
记录锁定空间 id 2874 页号 6 n 位 184 索引 PRIMARY
表 hms
.order_hotel_info
trx id 107D2F81 lock_mode X 锁定记录但不锁定间隙
TABLE LOCK 表hms
.commission_order_hotel_info_ext
trx id 107D2F81 锁定模式IX
记录锁空间 id 3123 页号 3 n 位 128 索引 PRIMARY
表 hms
.commission_order_hotel_info_ext
trx id 107D2F81 lock_mode X 等待
---事务 107D1795,活动 845 秒
5 个锁结构,堆大小 1248,59 行锁,撤消日志条目 2
MySQL 线程 id 23819,OS 线程句柄 0x50dc7940,查询 id 207389624 192.168.126.83 ppb
Trx 读取视图不会看到 id >= 107D1796 的 trx,看到 hms.order_hotel_info
trx id 107D1795 锁定模式IX
记录锁空间 id 2874 页号 16 n 位 1272 索引 uniq_hotel_id
表 hms
.order_hotel_info
trx id 107D1795 lock_mode X 锁定记录但不锁定间隙
记录锁定空间 id 2874 页号 44 n 位 232 索引 PRIMARY
表 hms
.order_hotel_info
trx id 107D1795 lock_mode X 锁定记录但不锁定间隙
TABLE LOCK 表hms
.commission_order_hotel_info_ext
trx id 107D1795 锁定模式IX
记录锁空间 id 3123 页号 3 n 位 128 索引 PRIMARY
表 hms
.commission_order_hotel_info_ext
trx id 107D1795 lock_mode X
解决方法
【问题讨论】:
能否请您提供您的交易设置和代码,以便我们查看导致问题的原因? 使用Spring注解@Transactional,会抛出异常,但是改成@Transactional(propagation=Propagation.REQUIRES_NEW)就可以了。 添加 MySQL 服务器信息。隔离是 REPEATABLE-READ 【参考方案1】:此问题是由于连接无法获得数据库中行的锁定。这是由于另一个事务在同一行上的锁定时间过长,以至于您的事务在等待它完成并解锁该行时超时。包含当时的配置、代码和数据库服务器日志会对您有所帮助,以便我们确定问题出在哪里;因为这可能不是由您的代码引起的问题,而是另一个应用程序未按应有的方式释放其锁定的问题。
您对 @Transactional(propagation=Propagation.REQUIRES_NEW) 使您的代码工作的评论表明先前的事务(可能由您的方法链建立的一个事务)没有按应有的方式释放锁。
再次,包括您的代码和配置。我看到您从 XML 中包含了您的 transactionManager bean 声明。但是这一次,实际上包括了您的代码、您的完整数据源以及方法链配置中涉及的 bean。我知道包含所有代码似乎很有效,但是如果您需要帮助,我们需要信息。在这种情况下,信息永远不会太多。如果您想了解如何提出好问题的示例,请查看我的示例。
【讨论】:
以上是关于超过锁定等待超时;尝试重新启动交易[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
保存/更新模型时,Django“超过锁定等待超时;尝试重新启动事务”