查询SQL触发唯一索引解决办法(@Transactional控制下且之前有delete和save操作)

文章讨论了在使用Hibernate进行数据库操作时,由于其性能优化策略可能导致的唯一索引冲突。作者解释了删除-保存操作在事务控制下的执行顺序问题,并提出在delete后添加flush操作来解决这个问题。
摘要由CSDN通过智能技术生成

场景:

        代码报错,显示某个表触发了唯一索引,但是出错位置却在查询语句上,保存的表在之前有先delete后再save操作,且上述数据库操作都在@Transactional控制下。

分析:

        表触发唯一索引,说明是有两条数据有唯一冲突导致的,查询该表的数据库操作,发现有先delete后再save,且查询/删/增都在@Transactional控制下,可能是查询语句需要实际访问数据库,带着之前的删除/新增一起在数据库执行,但是数据库SQL执行顺序与代码中不同,先增再删了。

网上查询问题原因:

Hibernate 在实际执行SQL语句时并没有按照代码的顺序执行,而是按照 INSERT, UPDATE, DELETE的顺序执行的

原因是Hibernate 为了性能优化,不会直接将SQL语句提交给数据库,而是先放在缓存中,等commit的时候一起提交,利用batch操作提高数据库的性能,而这就导致了SQL的执行顺序与实际的代码顺序不一致,直接导致了代码抛出异常

原文地址:https://cloud.tencent.com/developer/article/1603391

解决办法:

在delete后增加一个flush操作,增加该操作不会影响@Transactional事务控制。

personDao.delete(t);
personDao.flush();
personDao.save(newT)

flush操作是指强制将当前持久化上下文(Persistence Context)中的所有更改立即同步到数据库中,通常不需要手动调用flush方法,因为Spring Data JPA会在适当的时机自动执行flush

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值