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

时间:2012-10-11 13:36:55

标签: 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)

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),没关系。

我在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 auditor_tel =&#39; 0898-88350052&#39;,

            global_commission_percent = 10.00,


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

Trx读取视图不会看到id为&gt; = 107D2F82的trx,看到&lt; 107D1795 ------- TRX已经等待18秒获得此锁定:

RECORD LOCKS空间id 3123 page no 3 n bits 128表PRIMARY的索引hmscommission_order_hotel_info_ext trx id 107D2F81 lock_mode X waiting

表LOCK表hmsorder_hotel_info trx id 107D2F81锁定模式IX RECORD LOCKS空格id 2874 page no 16 n bit 1272表uniq_hotel_id的索引hmsorder_hotel_info trx id 107D2F81 lock_mode X锁定rec而不是gap RECORD LOCKS空格id 2874 page no 6 n bits 184表PRIMARY的索引hmsorder_hotel_info trx id 107D2F81 lock_mode X锁定rec而不是gap 表LOCK表hmscommission_order_hotel_info_ext trx id 107D2F81锁定模式IX RECORD LOCKS空格id 3123 page no 3 n bits 128表PRIMARY的索引hmscommission_order_hotel_info_ext trx id 107D2F81 lock_mode X waiting --- TRANSACTION 107D1795,ACTIVE 845秒 5个锁结构,堆大小1248,59行锁,撤消日志条目2 MySQL线程ID 23819,OS线程句柄0x50dc7940,查询ID 207389624 192.168.126.83 ppb Trx读取视图不会看到id为&gt; = 107D1796的trx,看到&lt; 107D1796 表LOCK表hmsorder_hotel_info trx id 107D1795锁定模式IX RECORD LOCKS空格id 2874 page no 16 n bits 1272表uniq_hotel_id的索引hmsorder_hotel_info trx id 107D1795 lock_mode X锁定rec而不是gap RECORD LOCKS空格id 2874 page no 44 n位232表PRIMARY的索引hmsorder_hotel_info trx id 107D1795 lock_mode X锁定rec而不是gap 表LOCK表hmscommission_order_hotel_info_ext trx id 107D1795锁定模式IX RECORD LOCKS空格id 3123 page no 3 n bits 128表PRIMARY的索引hmscommission_order_hotel_info_ext trx id 107D1795 lock_mode X

解决它的步骤

1 个答案:

答案 0 :(得分:4)

问题是由于连接无法锁定数据库中的行而导致的。这是因为当另一个事务在同一行上锁定这么长时间以至于您的事务已经超时等待它完成并解锁该行。您可以在此时包含配置,代码和数据库服务器日志,以便我们确定问题的来源;因为这可能不是由你的代码引起的问题,而是另一个应用程序没有释放它的锁定的问题。

你的评论@Transactional(propagation = Propagation.REQUIRES_NEW)使你的代码工作,这表明先前的一个事务,可能是你的方法链建立的事务没有释放锁。

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