0

ロック待ちタイムアウトオーバーエラーが発生しました。以下は例外です:

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 を実行し、これらを出力します。 s)、元に戻すログ エントリ 1 MySQL スレッド ID 23795、OS スレッド ハンドル 0x50e8a940、クエリ ID 207416339 192.168.126.236 ppb Updating 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 秒間待機しています:

RECORD LOCKS スペース ID 3123 ページ番号 3 n ビット 128PRIMARYテーブルのインデックスhmscommission_order_hotel_info_exttrx id 107D2F81 lock_mode X 待機中

TABLE LOCK テーブルhmsorder_hotel_infotrx id 107D2F81 ロック モード IX RECORD LOCKS スペース ID 2874 ページ番号 16 n ビット 1272uniq_hotel_idテーブルのインデックスhmsorder_hotel_infotrx id 107D2F81 lock_mode X は rec をロックしますが、ギャップはロックしません RECORD LOCKS スペース ID 2874 ページ番号 6 n ビット 184PRIMARYテーブルのインデックスhmsorder_hotel_infotrx id 107D2F81 lock_mode X は rec をロックしますが、gap TABLE LOCK table はロックしませんhmscommission_order_hotel_info_exttrx id 107D2F81 ロック モード IX RECORD LOCKS スペース ID 3123 ページ番号 3 n ビット 128PRIMARYテーブルのインデックスhmscommission_order_hotel_info_exttrx id 107D2F81 lock_mode X 待機中 ---TRANSACTION 107D1795、ACTIVE 845 秒 5 ロック構造体、ヒープ サイズ 1248、59 行ロック、元に戻すログ エントリ 2 MySQL スレッド ID 23819、OS スレッド ハンドル 0x50dc7940、クエリ ID 207389624 192.168.126.83 ppb Trx 読み取りビューでは、id >= 107D1796 の trx は表示されず、< 107D1796 TABLE LOCK table が表示されますhmsorder_hotel_infotrx id 107D1795 ロック モード IX RECORD LOCKS スペース ID 2874 ページ番号 16 n ビット 1272uniq_hotel_idテーブルのインデックスhmsorder_hotel_infotrx id 107D1795 lock_mode X は rec をロックしますが、ギャップはロックしません RECORD LOCKS スペース ID 2874 ページ番号 44 n ビット 232PRIMARYテーブルのインデックスhmsorder_hotel_infotrx id 107D1795 lock_mode X は rec をロックしますが、gap TABLE LOCK table はロックしませんhmscommission_order_hotel_info_exttrx id 107D1795 ロック モード IX RECORD LOCKS スペース ID 3123 ページ番号 3 n ビット 128PRIMARYテーブルのインデックスhms. commission_order_hotel_info_exttrx id 107D1795 lock_mode X

それを解決するための手順

4

1 に答える 1

7

この問題は、接続がデータベース内の行のロックを取得できないために発生します。これは、別のトランザクションが同じ行を長時間ロックしているため、トランザクションが完了して行のロックを解除するのを待ってタイムアウトした場合に発生します。問題の原因を特定できるように、その時点での構成、コード、およびデータベース サーバーのログを含めていただけると助かります。これはコードが原因の問題ではない可能性がありますが、別のアプリケーションがロックを解放していないという問題があるためです。

@Transactional(propagation=Propagation.REQUIRES_NEW) がコードを機能させるというコメントは、以前のトランザクション、おそらくメソッドチェーンによって確立されたトランザクションがロックを解放していないことを示しています。

ここでも、コードと構成を含めます。XML から transactionManager Bean 宣言が含まれているのを見ました。しかし今回は、実際にはコード、完全なデータソース、およびメソッド チェーンの構成に含まれる Bean を含めます。すべてのコードを含めるのは大変なことのように思えるかもしれませんが、助けが必要な場合は情報が必要です。この状況では、情報が多すぎることはありません。良い質問をする方法の例が必要な場合は、私のものを見てください。

于 2012-10-11T13:49:38.213 に答える