Ошибка взаимоблокировки БД: пакетное обновление с использованием Hibernate
Это ошибка, с которой я сталкиваюсь при пакетном обновлении базы данных MSSQL. Ошибка наблюдается, когда 2 параллельных клиентских запроса пытаются обновить эту таблицу.
2020-12-17 17:07:48 ERROR SqlExceptionHelper:131 - Transaction (Process ID 85) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
2020-12-17 17:07:48 ERROR ExceptionMapperStandardImpl:39 - HHH000346: Error during managed flush [org.hibernate.exception.LockAcquisitionException: could not execute statement]
Пример кода, из которого выдается это исключение, выглядит следующим образом.
@Transactional
public static <T> void bulkSaveUpdate(HibernateTemplate crudTemplate, List<T> lstSave) {
int batchSize = 10;
final AtomicInteger incr = new AtomicInteger(1);
lstSave.stream().forEach(t -> {
int i = incr.getAndIncrement();
crudTemplate.saveOrUpdate(t);
if (i > 0 && i % batchSize == 0) {
crudTemplate.flush();
crudTemplate.clear();
}
});
}
Приложение построено на базе Spring REST. Используемый ORM — Hibernate. Выполненный запрос на обновление выглядит следующим образом
update TESTSTEPRUN set ACCESSIBILITY_REPORT=?, ACT_ON_ALL=?, ACTION_ASSERTION=?, actionId=?, actionName=?, ACTIVITIES=?, APP_ID=?, ASSERT_FILE_PATH=?, ATTRIBUTE_FIELD=?, ATTRIBUTE=?, AUTOMATION_TYPE=?, BROWSER_NAME=?, CREATED_BY=?, DATA_ENCRYPTION=?, DATE_FORMAT=?, DESCRIPTION=?, PCLOUDY_DEVICE_ID=?, PCLOUDY_DEVICE_NAME=?, DIFF_IMAGE=?, DURATION_SECONDS=?, ELEMENT_POSITION=?, EXPECTED=?, EXP_VALUE=?, FILE_TYPE=?, FLOATER=?, GSPECFILE=?, HEALED_EXCEPTION_CATEGORY=?, HEALED_LOCATOR=?, HEALED_LOCATOR_TYPE=?, INPUT_DATA=?, INPUT_REQUIRED=?, LAYOUT_REPORT=?, LAYOUT_SCREENSHOT=?, LOCATOR=?, MACHINE_NAME=?, MANDATORY_CHECK=?, methodCategory=?, METHOD_TYPE=?, MODULE_ID=?, MODULE_NAME=?, NEXT_ACTION=?, OBJECT_PROPERTY=?, TESTSTEP_ORDER=?, OTP_FORMAT=?, OUTPUT_RESULT=?, PACKAGE_NAME=?, PAGE_OBJECT_PROPERTY=?, PROJECT_ID=?, REASON=?, RESOLUTIONSIZE=?, RUN_ID=?, SCREENSHOT=?, STARTED_AT=?, STATUS=?, STEP_DATA=?, TESTSTEP_NAME=?, STOPPED_AT=?, subActionId=?, subActionName=?, TABLE_ID=?, TARGET_ELEMENT=?, testObjectId=?, TESTSEQ_ID=?, TESTCASE_ID=?, TESTSET_ID=?, TESTSTEP_ID=?, TIME_ZONE=?, TYPE_DECIDER=?, FIELD=?, EXP_VALUE_FORMAT=?, MODULE=? where TESTSTEPRUN_ID=?
Любая помощь в решении этой проблемы высоко ценится.