JPA并发save失效
具体场景:在并发的情况下,save函数的失效问题。
在实际工作中遇到该问题,当时挺苦恼的。为什么通过 save 保存的数据丢失了呢?
但是有时却能正确保存,这是怎么回事呢!!
情况描述:
1. 服务A(简A) 通过服务B(简B) ,将账单C从A保存在B中,并保存在数据库中;
2.B对于传入的C,创建内部账单 -> 再创建第三方账单(save) -> 业务逻辑 -> 响应A;
3.A 在未接受到响应时,立即再次使用C向B发起请求;
4.预期:2条内部账单,2条第三方账单,但实际只有步骤3的第三方账单,步骤1丢弃掉了。
从上述情况,就可以看出。jpa 的 save != INSERT INTO 哦
分析1:第一次创建的第三方账单,使用C作为主键,将数据保存下来;
分析2:第二次创建时,使用C作为主键保存时,发现已经存在,则更新并替换数据。
源码:
事实: save 并没有失效,而是它具有插入和更新的能力。
办法1:使用明确的SQL , 执行Insert Into 语句,从本质上解决,后续被捕获异常。
办法2:通过锁的方式,先查询没有再save。(对于大量并发并不适用哦)
办法3:通过缓存中间件,例如 Redis 等,但弊端受限于网络。服务集群可以这样处理。
tips : 感谢收藏和关注的博友们哟~
JPA并发save失效相关推荐
- 缓存穿透、并发和失效的解决方案
我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 缓存穿透 注:上面三个图会有什么问题呢? 我们在项目中使用缓存通常都是先检查缓 ...
- MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效
问题描述:MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效.MySQL数据库中构建的用户表表结构如下所示: DROP TABLE IF ...
- SpringBoot实现JPA的save操作
在一次参与公司的技术讨论会上,一位同事在演示SpringBoot的JPA的操作时,发现SpringBoot的JPA的save操作时,发现会先有select再insert,然后老板说,我们在网关已经 ...
- jpa SessionFactory事物失效
前言: 因为项目中使用jpa的SessionFactory用@Autowired的方式来操作Hibernate的Session,死活开不了事物,最后终于在一篇博客的帮助下,了解到使用SessionFa ...
- 缓存穿透、缓存并发、缓存失效之思路变迁
来源:https://www.jianshu.com/p/d96906140199 在用缓存的时候,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 一.缓存穿透 上面三个图会有什么问题呢 ...
- 二级缓存失效_缓存核心技术:缓存穿透、缓存并发、缓存失效之思路变迁
在用缓存的时候,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 一.缓存穿透 上面三个图会有什么问题呢? 我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果 ...
- Spring Data Jpa中的save和saveAndFlush方法
Spring Data Jpa中save和saveAndFlush的区别,首先直接看图: save是CurdRepository接口下的方法 saveAndFlush是JpaRepository接口下 ...
- JPA踩坑记:Spring Data Jpa 更新为null的问题(save方法保存时null值会被更新到数据库)
关键字: JPA更新为null,JPA save null,JPA保存为null 今天使用jpa的save方法时发现null字段也会被更新到数据库,这个直接把数据库数据覆盖的行为很可怕,果断研究了一下 ...
- 使用sharding做分库分表,使用jpa,发生的save不报错,数据库缺插不进去数据的问题
先讲讲问题的诞生,我们项目起初没有引进 sharding分库,而是在项目上线前,才做的分库分表.也就是之前的业务都写好的,所以知道业务代码没有任何问题. 然后引入 sharding 的相关的依赖以后, ...
- redis有值查询返回null_Redis缓存穿透、缓存并发、热点缓存之最佳招式
一.前言 我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 缓存穿透 注: 上面三个图会有什么问题呢? 我们在项目中使用缓存通常 ...
最新文章
- pta函数统计素数并求和_黎曼的zeta函数
- Bash shell
- MySQL数据库自连接查询inner join ... on
- ue4加载本地版本_【虚幻4】创建本地数据库
- 2020-11-16(常见加密算法统计)
- E1. Rubik‘s Cube Coloring (easy version) 贪心,满二叉树(1300)
- Linux下V4L2捕捉画面+H264压缩视频+帧缓冲显示视频————H264压缩视频
- oracle dbwr trace文件,ORA-01157: cannot identify/lock data file 19 - see DBWR trace file问题处理...
- 看了一下lua的实现
- android 4.0 禁用系统home键
- [原]ActiveReport6 for net使用(一)
- Mysql Like 性能优化总结
- win10系统安装SQL Server2005中文版安装教程和下载地址(亲测成功)
- 人工智能究竟能否实现?
- 小程序心知天气API获取数据
- 大数据零基础学习并不难,从0到1你需要的不仅仅是努力!
- 微信小程序开发经验总结
- Qt开发之QLineEdit简单介绍
- 联想小新 mini 主机 评测
- 龙迅LT7911D Type-C/DP/eDP to MIPI DSI/CSI/LVDS 信号转换芯片
热门文章
- 用时一个半个月,七月刚入职字节跳动的测试开发面试题,内附答案
- 把小米盒子变成文件服务器,【教程】教你在小米电视、小米盒子上导出应用源文件分享!...
- 惠普(HP) LaserJet Pro M1136 MFP 黑白多功能激光一体机 (打印 复印 扫描)驱动安装记录
- 磁盘分区助手使用心得
- 解决 Winfrom richtextbox不显示RTF文档 图片问题
- 输入数字怎么变成大写python_用Python将数字转换为中文大写
- 摄氏度和开氏度的换算_摄氏度、华氏度和开氏度有何区别?
- 机器学习----深刻理解高斯过程回归
- 网页顶部广告展开与收起
- 电脑软件推荐安装列表