我发生 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
表索引hms
。commission_order_hotel_info_ext
trx id 107D2F81 lock_mode X 等待
表锁表hms
。order_hotel_info
trx id 107D2F81 锁定模式 IX RECORD LOCKS 空间 id 2874 页号 16 n 位 1272uniq_hotel_id
表索引hms
。order_hotel_info
trx id 107D2F81 lock_mode X 锁定 rec 但不锁定间隙 RECORD LOCKS 空间 id 2874 页号 6 n 位 184PRIMARY
表索引hms
。order_hotel_info
trx id 107D2F81 lock_mode X 锁定rec 但不锁定间隙TABLE LOCK 表hms
。commission_order_hotel_info_ext
trx id 107D2F81 锁定模式 IX RECORD LOCKS 空间 id 3123 页号 3 n 位 128PRIMARY
表索引hms
。commission_order_hotel_info_ext
trx 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 表hms
。order_hotel_info
trx id 107D1795 锁定模式 IX RECORD LOCKS 空间 id 2874 页号 16 n 位 1272uniq_hotel_id
表索引hms
。order_hotel_info
trx id 107D1795 lock_mode X 锁定 rec 但不锁定间隙 RECORD LOCKS 空间 id 2874 页号 44 n 位 232PRIMARY
表索引hms
。order_hotel_info
trx id 107D1795 lock_mode X 锁定记录但不锁定间隙表锁定表hms
。commission_order_hotel_info_ext
trx id 107D1795 锁定模式 IX RECORD LOCKS 空间 id 3123 页号 3 n 位 128PRIMARY
表索引hms
. commission_order_hotel_info_ext
trx id 107D1795 lock_mode X
什么步骤来解决它