Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. Java
  3. 正文
                           

【原创】仅使用set属性值就把数据库数据给改了

2020-04-10 1366点热度 0人点赞 0条评论

























1

背景


最近小伙伴要上线一个小特性——审阅状态的变更。在上线的过程中,发现一个非常奇怪的问题。


基本上保证了逻辑没问题 ,多次检查也没问题。但是事实就是发生了!

小伙伴有点怀疑人生了:)。


所以我们临时的处理方式是增加日志打印,逐步验证我们的逻辑。看看我们是如何排查问题的。


使用的技术框架:springboot+jpa



2

问题排查


1)原逻辑代码


ALog aLog = aLogRepository.findOne(logId);
if (aLog.getStatus == UNKNOWN) {
    aLog.setStatus(INIT); // ①
} else {
    // ②
    aLog.setStatus(RUNNING);
    aLogRepository.save(aLog);
    return;
}
// ③发送短信
smsAdapter.sendSms("手机号", "状态变更...");
return true;


上面是经过抽离的主要逻辑,存在的问题:


逻辑不会进入到②,只会进入到①和③,也就是当前的记录状态无需更新,并且需要发送短信。但是数据库的aLog记录状态就被更新了,到底是为什么?又没有调用save方法进行更新记录,怎么就会把数据给改了?


由于多次检查和增加日志逻辑验证,我们最终是确保逻辑是没问题的。


此时,我想到了唯一一个问题,就是跟Hibernate的对象状态有关!那么到底是不是呢,我们就得继续排查确认了。


2)原来是这样的


smsDao.save(sms);
smsHandle.sendSms();


查看了发送短信的逻辑,原来这里会将短信记录保存到数据库,再调用短信接口发送对应的短信内容。


那么,很有可能就是这里的smsDao.save帮忙把aLog顺便一起update了?事实确实如此。小伙伴就把发送短信的逻辑代码注释掉,重新测试调用接口,这时aLog数据库记录就不会被更新了。


所以罪魁祸首就是“它”。


这个时候就确定了是Hibernate包含了三种状态,此时aLog查询出来,数据库有此记录,session也有此对象,说明当前aLog是处于持久化状态,如果在事务提交的时候,会判断当前对象记录是否发生改变,是的话就会触发update操作。


所以,这也就是为什么aLog并没有主动调用save操作,就帮忙把它自动更新了。


重新理了一下逻辑,也调整了下代码,因为①aLog.setStatus(INIT)并不需要,多此一举了。所以把它去掉即可。


3)了解Hibernate的状态


Hibernate存在transient(瞬时状态),persistent(持久化状态)以及detached(离线状态)。


瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象。


①对于刚创建的一个对象,如果session中和数据库中都不存在该对象,那么该对象就是瞬时对象(Transient)。


②瞬时对象调用save方法,或者离线对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句。


③离线对象就是,数据库存在该对象,但是该对象又没有被session所托管。



3

总结


虽然这个问题并不难(或者这不算问题),但是为了避免其他人或者你可能以后也会遇到的这种问题,可以很好的帮助(你)避免重蹈覆辙。


1)对于查询出来的对象,如果无需更新就不要set属性值,有时可以创建新变量来存储当前的值;
2)使用JPA(Hibernate)要注意自动会“帮你”更新数据库数据;
3)记录每次遇到的不小不大的问题,可以帮助少踩坑。


参考:
https://www.cnblogs.com/xiaoluo501395377/p/3380270.html
http://www.luyixian.cn/news_show_268613.aspx



推荐好文

1、互联网Code Review最佳实践分享

2、dubbo面试题!会这些,说明你看懂了dubbo源码

3、Kafka面试题!掌握它才说明你真正懂Kafka
4、
Netty 5.0为啥被舍弃?原因竟然是...
5、
中台之上——业务架构系列【汇总】

6、必备瑞士军刀IDEA插件,你使用了哪些

7、线上热更新代码只需3步 Arthas实战

8、Eureka源码剖析之七:架构&面试题【总结】

9、互联网工程师应该用这种姿势打印日志

10、加入:互联网基础/架构交流群

-关注搬运工来架构,与优秀的你一同进步-

如果喜欢这篇文章或支持可以点在看哦↘

本文仅供学习!所有权归属原作者。侵删!文章来源: 搬运工来架构

更多文章:

  1. 迄今为止最完整的DDD实践
  2. Spring中@Autowired和@Inject注解的区别?
  3. Spring事务无法生效的11个场景
  4. JVM 内存分析工具 MAT 的深度讲解与实践——进阶篇(长文)
  5. 聊聊spring事务失效的12种场景,太坑了
  6. 殷浩详解DDD 第三讲 - Repository模式
  7. 【进阶玩法】策略+责任链+组合实现合同签章
  8. RocketMQ 很慢?引出了一个未解之谜
  9. 笔记 | Java对象探秘
  10. Eureka源码剖析之一:初始化-启动
标签: 原创
最后更新:2020-04-10

Cocodroid

专注Java后端,分享技术。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
最新 热点 推荐
最新 热点 推荐
微服务架构:必懂的6大性能维度 Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议
视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代微服务架构:必懂的6大性能维度
面试题:系统出现高CPU的原因是什么 订单超时怎么处理?我们用这种方案 ChatGLM:ChatGPT的替代方案 可插拔组件设计机制—SPI 6种限流实现,附代码![通俗易懂] 基于DDD的微服务设计和开发实战 生产环境的CMS垃圾回收,一定要这样配置参数 《解构领域驱动设计》读书笔记

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2