超过锁定等待超时;尝试重新启动交易[关闭]

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 索引 PRIMARYhms.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_idhms.order_hotel_info trx id 107D2F81 lock_mode X 锁定记录但不锁定间隙 记录锁定空间 id 2874 页号 6 n 位 184 索引 PRIMARYhms.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 索引 PRIMARYhms.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_idhms.order_hotel_info trx id 107D1795 lock_mode X 锁定记录但不锁定间隙 记录锁定空间 id 2874 页号 44 n 位 232 索引 PRIMARYhms.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 索引 PRIMARYhms.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。我知道包含所有代码似乎很有效,但是如果您需要帮助,我们需要信息。在这种情况下,信息永远不会太多。如果您想了解如何提出好问题的示例,请查看我的示例。

【讨论】:

以上是关于超过锁定等待超时;尝试重新启动交易[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 错误:超过锁定等待超时;尝试重新启动事务查询

保存/更新模型时,Django“超过锁定等待超时;尝试重新启动事务”

超过锁定等待超时;尝试重新启动事务 - 插入语句

超过锁定等待超时;尝试重新启动事务 MYSQL Python

超过锁定等待超时;从表中删除数据时尝试重新启动事务

Python3 - '超过锁定等待超时;尝试重新启动事务'并且只在数据库上处理