发生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)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',
global_commission_percent = 10.00,
guarantee = '{\"type\":\"none\"}'
WHERE
hotel_id = 10190Trx读取视图将看不到id为>= 107D2F82的trx,看到< 107D1795 - TRX已等待18秒,等待此锁被授予:
记录锁空间id 3123页编号3 n位128表hms的索引PRIMARY。commission_order_hotel_info_ext事务处理id 107D2F81 lock_mode X等待
表锁表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锁定rec而不是间隙记录锁定空间id 2874页no 6 n位184索引PRIMARY表hms。order_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表锁表格hms。order_hotel_info trx id 107D1795锁定模式IX记录锁定空间id 2874页no 16 n位1272表hms的索引uniq_hotel_id。order_hotel_info trx id 107D1795 lock_mode X锁定rec但不锁定间隙记录锁定空间id 2874页no 44 n位232索引PRIMARY表hms。order_hotel_info trx id 107D1795 lock_mode X锁定rec但不锁定间隙表锁表hms。commission_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
解决它的步骤是什么?
发布于 2012-10-11 21:49:38
该问题是由于连接无法锁定数据库中的行而导致的。当另一个事务锁定同一行很长时间,以至于您的事务在等待它完成并解锁该行时超时,就会出现这种情况。这将有助于您包括当时的配置、代码和数据库服务器日志,这样我们就可以确定问题的来源;因为这可能不是由您的代码引起的问题,而是另一个应用程序没有释放它应该释放的锁的问题。
你关于@Transactional(propagation=Propagation.REQUIRES_NEW)让你的代码正常工作的评论将表明之前的事务,可能是你的方法链建立的事务,没有像它应该的那样释放锁。
同样,包括您的代码和配置。我看到您在transactionManager中包含了XML声明。但这一次,实际上要包含您的代码、完整的数据源以及方法链配置中涉及的bean。我知道这看起来像是一项工作,包括你所有的代码,但如果你需要帮助,我们需要信息。在这种情况下,信息永远不会太多。如果你想要一个如何问一个好问题的例子,看看我的。
https://stackoverflow.com/questions/12840837
复制相似问题