我已經構建了一個rest-ful服務來插入大型行。要插入大量的行,我使用批量插入。什麼可能導致這個寧靜服務片段中的僵局。ConcurrencyFailureException:在批量添加大量行時出現死鎖
final SqlMapClient sqlMapClient = getSqlMapClientTemplate().getSqlMapClient();
sqlMapClient.startTransaction();
sqlMapClient.startBatch();
//data is of size say 10,000 i am dividing into 500 and inserting
do {
data500 = next 500 of data
getSqlMapClientTemplate().insert("insertData", data500);
}while(data500 is not empty)
sqlMapClient.executeBatch();
sqlMapClient.commitTransaction();
但我收到此錯誤:
Description : org.springframework.dao.ConcurrencyFailureException: SqlMapClient operation; SQL []; --- The error occurred while applying a parameter map. --- Check the insertData-InlineParameterMap. --- Check the statement (update failed). --- Cause: java.sql.SQLException: Transaction (Process ID 3121) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
編輯爲您的特定情況包括'修復'(您正在鎖定*所有10000左右*記錄(可能加上一個高位表鎖) – rolfl 2013-05-07 14:49:34
但我想要輸入所有10000或不輸入。但在這種情況下,如果您在每批次之後提交,則可能只插入其中的一部分 – dumper 2013-05-08 06:56:02
一個非常現實的可能性是,當您開始插入記錄時,會鎖定要插入的行/頁面,但是,在某個時間點,數據庫決定你有這麼多的鎖,它們不是單獨跟蹤它們的效率,而是將它們升級到一個單一的全表鎖,如果有其他進程正在修改,甚至可能從該表中選擇,那麼你有一個死鎖條件: – rolfl 2013-05-08 10:28:57