数据库死锁错误:使用 Hibernate

问题描述

这是我在对 MSsql DB 进行批量更新时遇到的错误。当 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=?

非常感谢您对解决此问题的任何帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...