Я построил службу отдыха, чтобы вставить большие строки. Чтобы вставить большое количество строк, я использую вставку пакетами. Что может вызвать тупик в этом фрагменте обслуживания.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
, но я хочу, чтобы либо все 10000 было введено, либо ни один не должен вводиться. в этом случае, если вы фиксируете после каждой партии, то есть вероятность, что вставлены только некоторые из них. – dumper
Очень реальная возможность заключается в том, что при запуске вставки записей вы блокируете строки/страницы, в которые вы вставляете. Но, в какой-то момент база данных решает, что у вас так много блокировок, что неэффективно отслеживать их по отдельности, а для того, чтобы эскалировать их в одну полную блокировку таблицы. Если какой-либо другой процесс изменял или даже мог выбирать из этой таблицы, тогда у вас есть условие взаимоблокировки. – rolfl