fuy*_*001 0 java mysql spring jdbc
我发生锁定等待超时超出错误。以下是例外:
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 LOCK WAIT 5锁定结构,堆大小1248,3行锁定( 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秒,需要授予此锁定:
PRIMARY表的索引hms。commission_order_hotel_info_exttrx id 107D2F81 lock_mode X等待TABLE LOCK表hms。order_hotel_infotrx ID 107D2F81锁定模式IX RECORD LOCKS空间ID 2874页号16 n位1272 uniq_hotel_id表的索引hms。order_hotel_infotrx ID 107D2F81 lock_mode X锁定记录,但不锁定间隙RECORD LOCKS空间ID 2874页号6 n位184 PRIMARY表索引hms。order_hotel_infotrx id 107D2F81 lock_mode X锁定记录,但不锁定间隙表锁定表hms。commission_order_hotel_info_exttrx ID 107D2F81锁定模式IX RECORD LOCKS空间ID 3123页号3 n位128 PRIMARY表索引hms。commission_order_hotel_info_exttrx id 107D2F81 lock_mode X等待--- TRANSACTION 107D1795,活动845秒5锁结构,堆大小1248,59行锁,撤消日志条目2 MySQL线程ID 23819,操作系统线程句柄0x50dc7940,查询ID 207389624 192.168.126.83 ppb Trx读取视图将看不到ID> = 107D1796的trx,而看到<107D1796 TABLE LOCK table hms。order_hotel_infotrx ID 107D1795锁定模式IX RECORD LOCKS空间ID 2874页号16 n位1272 uniq_hotel_id表的索引hms。order_hotel_infotrx ID 107D1795 lock_mode X锁定记录但不锁定间隙RECORD LOCKS空间ID 2874页号44 n位232 PRIMARY表索引hms。order_hotel_infotrx ID 107D1795 lock_mode X锁定记录,但不锁定间隙表锁定表hms。commission_order_hotel_info_exttrx ID 107D1795锁定模式IX RECORD LOCKS空间ID 3123页号3 n位128 PRIMARY表索引hms。commission_order_hotel_info_exttrx ID 107D1795 lock_mode X
解决什么步骤
该问题是由于连接无法锁定数据库中的行引起的。当另一个事务在同一行上锁定了很长时间以致您的事务已超时,等待它完成并解锁该行时,就会导致这种情况。这段时间包含您的配置,代码和数据库服务器日志将对您有所帮助,以便我们确定问题的根源。因为这可能不是由您的代码引起的问题,但是另一个应用程序未按应有的状态释放它的锁的问题。
您的@Transactional(propagation = Propagation.REQUIRES_NEW)使您的代码正常工作的评论将表明,先前的事务(可能是您的方法链建立的事务)没有按预期方式释放锁。
同样,包括您的代码和配置。我看到您在XML中包含了transactionManager bean声明。但是这次,实际上包括代码,完整的数据源以及方法链配置中涉及的bean。我知道将所有代码都包含在内似乎是一项工作,但是如果您需要帮助,我们需要信息。在这种情况下,永远不会有太多的信息。如果您想举一个如何问一个好问题的例子,请看我的。