微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数据库死锁错误:使用 Hibernate

如何解决数据库死锁错误:使用 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 举报,一经查实,本站将立刻删除。