hibernate - Hibernate:防止不同线程插入重复行
问题描述
我正在使用休眠与 Spring 进行数据持久性。
情景是
Time- 00 Hour:01 Minute:01 Second:100 ms
- 收到请求 1 以持久化名为“abc”、姓氏“Xyz”的人(考虑本次会议 1)
- 如果存在相同的记录,则查找 DB
- 没有找到记录
- 对象被创建,Hibernate 为记录生成唯一 ID
Time- 00 Hour:01 Minute:01 Second:102 ms
- 收到请求 2 以持久化名为“abc”、姓氏“Xyz”的人(考虑本次会议 2)
- 如果存在相同的记录,则查找 DB
- 没有找到记录
- 对象被创建,Hibernate 为记录生成唯一 ID
Time- 00 Hour:01 Minute:01 Second:103 ms
- 会话 1 使用 saveOrUpdate() 保存记录;
Time- 00 Hour:01 Minute:01 Second:104 ms
- 会话 2 使用 saveOrUpdate() 保存记录;
由于两个会话都在生成唯一标识,因此休眠将它们视为单独的对象并持久存在于数据库中。但这稍后会导致应用程序出现问题。
我也有唯一索引,但也包括 Id 字段,因此 DB 也无法将它们视为唯一记录。
建议避免重复插入的方法。
解决方案
如果我理解正确,您没有任何唯一可识别的字段可以告诉后端传入记录是几秒钟前收到的重复记录。
在这种情况下,我很害怕,但可能没有直接的方法来处理这个问题(我可能错了)。可以有间接的方式,比如
- 在插入之前检查审计日志,以检查是否在最后几秒或几分钟内插入了具有相似数据的记录。
- 从后端向前端发送唯一代码。前端必须使用该代码打到后端。代码在单次使用后过期。并在每次插入之前检查从 FE 发送的代码是否有效
可以有许多这样的方法,并且必须根据项目的复杂性、性能要求等得出最佳解决方案。
推荐阅读
- c++ - 如何在模板类范围内定义模板运算符?
- math - 是否可以使用 VHDL 中的 generate 构造来实现波纹进位加法器?
- javascript - 在执行下一个在 NodeJS 中使用该数据的函数之前完成一个 readln 函数
- python-3.x - cv2.cvtColor 神秘地杀死了 python 工作者而不抛出异常
- python-3.x - .map 函数 Tensorflow 数据集出错
- ios - becomeFirstResponder() 没有调出键盘 - Swift 5 - iOS 14
- python - 将绘图函数链接到“plt.ax”
- c - 尝试打印队列时出现分段错误
- json - 解决“超过 30 次重定向”
- spring-cloud - Spring Cloud Gateway 路由不起作用,Hystrix Dashboard 加载崩溃