首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁定等待超时;请尝试重新启动事务

锁定等待超时;请尝试重新启动事务
EN

Stack Overflow用户
提问于 2012-10-11 21:36:55
回答 1查看 17.9K关注 0票数 0

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

代码语言:javascript
复制
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)

spring transaction config <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>

使用Spring注解@Transactional,它会向@Transactional(propagation=Propagation.REQUIRES_NEW)抛出exception.but更改,这是可以的。

我在MySqlServer上执行show engine innodb status \G,输出这些:--事务107D2F81,活动18秒开始索引读取正在使用的MySQL表1,锁定1个锁等待5个锁结构,堆大小1248,3个行锁,撤消日志条目1 mysql线程id 23795,操作系统线程句柄0x50e8a940,查询id 207416339 192.168.126.236 ppb更新commission_order_hotel_info_ext设置auditor_tel = '0898-88350052',

代码语言:javascript
复制
            global_commission_percent = 10.00,


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

Trx读取视图将看不到id为>= 107D2F82的trx,看到< 107D1795 - TRX已等待18秒,等待此锁被授予:

记录锁空间id 3123页编号3 n位128表hms的索引PRIMARYcommission_order_hotel_info_ext事务处理id 107D2F81 lock_mode X等待

表锁表hmsorder_hotel_info trx id 107D2F81锁定模式IX记录锁定空间id 2874页编号16 n位1272表uniq_hotel_id的索引hmsorder_hotel_info trx id 107D2F81 lock_mode X锁定rec而不是间隙记录锁定空间id 2874页no 6 n位184索引PRIMARYhmsorder_hotel_info trx id 107D2F81 lock_mode X锁定rec但不锁定间隙表锁表格hms。<代码>d15 trx id 107D2F81锁定模式IX记录锁定空间id 3123页no 3 n位128索引<代码>d16表hms。事务处理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,请参阅< 107D1796表锁表格hmsorder_hotel_info trx id 107D1795锁定模式IX记录锁定空间id 2874页no 16 n位1272表hms的索引uniq_hotel_idorder_hotel_info trx id 107D1795 lock_mode X锁定rec但不锁定间隙记录锁定空间id 2874页no 44 n位232索引PRIMARYhmsorder_hotel_info trx id 107D1795 lock_mode X锁定rec但不锁定间隙表锁表hmscommission_order_hotel_info_ext trx id 107D1795锁定模式IX记录锁定空间id 3123页no 3 n位128索引D29<表hms的/code>。commission_order_hotel_info_ext服务id 107D1795 lock_mode X

解决它的步骤是什么?

EN

回答 1

Stack Overflow用户

发布于 2012-10-11 21:49:38

该问题是由于连接无法锁定数据库中的行而导致的。当另一个事务锁定同一行很长时间,以至于您的事务在等待它完成并解锁该行时超时,就会出现这种情况。这将有助于您包括当时的配置、代码和数据库服务器日志,这样我们就可以确定问题的来源;因为这可能不是由您的代码引起的问题,而是另一个应用程序没有释放它应该释放的锁的问题。

你关于@Transactional(propagation=Propagation.REQUIRES_NEW)让你的代码正常工作的评论将表明之前的事务,可能是你的方法链建立的事务,没有像它应该的那样释放锁。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12840837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档