Hibernate 休眠:防止不同线程插入重复行

Hibernate 休眠:防止不同线程插入重复行,hibernate,Hibernate,我正在使用hibernate对Spring进行数据持久化 情况是 时间-00小时:01分钟:01秒:100毫秒 已收到请求-1,请求持久化名为“abc”、姓为“Xyz”的人员(考虑本次会话1) 如果存在相同的记录,则查找数据库 没有找到任何记录 对象创建后,Hibernate将为记录生成唯一的ID 时间-00小时:01分钟:01秒:102毫秒 已收到请求-2,请求持久化名为“abc”、姓为“Xyz”的人员(考虑本次会话2) 如果存在相同的记录,则查找数据库 没有找到任何记录 对象创建后

我正在使用hibernate对Spring进行数据持久化

情况是
时间-00小时:01分钟:01秒:100毫秒

  • 已收到请求-1,请求持久化名为“abc”、姓为“Xyz”的人员(考虑本次会话1)
  • 如果存在相同的记录,则查找数据库
  • 没有找到任何记录
  • 对象创建后,Hibernate将为记录生成唯一的ID
时间-00小时:01分钟:01秒:102毫秒

  • 已收到请求-2,请求持久化名为“abc”、姓为“Xyz”的人员(考虑本次会话2)
  • 如果存在相同的记录,则查找数据库
  • 没有找到任何记录
  • 对象创建后,Hibernate将为记录生成唯一的ID
时间-00小时:01分钟:01秒:103毫秒

  • 会话1使用saveOrUpdate()保存记录
时间-00小时:01分钟:01秒:104毫秒

  • 会话2使用saveOrUpdate()保存记录
由于这两个会话都生成唯一的标识,hibernate将它们视为单独的对象并在数据库中持久化。但这在以后的应用中会引起问题

我也有唯一索引,但它也包括Id字段,所以DB也无法将它们视为唯一记录


建议避免重复插入的方法。

如果我理解正确,您没有任何可唯一识别的字段,这些字段可以告诉后端,传入的记录是在几秒钟之前收到的重复记录

在这种情况下,恐怕没有直接的方法来处理(我可能错了)。可以有间接的方式,如

  • 在插入之前检查审核日志,以检查在最后几秒钟或几分钟内是否插入了具有类似数据的记录
  • 将唯一代码从后端发送到前端。前端必须使用该代码访问后端。代码在一次性使用后过期。并在每次插入前检查FE发送的代码是否有效

有很多这样的方法,并且必须根据项目的复杂性、性能要求等得出最佳解决方案。

您个人如何解决此问题?为什么您有一个包含自动生成ID的唯一索引?为什么会出现这样的指数?是的,经过几天的思考,我甚至找不到任何直接的方法来处理这个案件。谢谢你提出可能的解决办法。将尝试提出审计建议。