博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录一个有意思的问题……
阅读量:6478 次
发布时间:2019-06-23

本文共 2210 字,大约阅读时间需要 7 分钟。

今天业务开发出现了一个有意思的问题:

一段操作逻辑里,两次update同一个表,如果两次updated偶成功,则对另一个表进行一次insert操作

两次update是用的同一个方法,传入参数对象属性值不同。

现象:

a.数据库里数据更新操作成功

b.insert操作,时而成功时而失败。
c.如果从头debug跟进每个处理逻辑,插入数据一定处理成功。

处理逻辑
private void deal(){    DataBO dataBO = new DataBO();    dataBO.setId(23);    dataBO.setXxx("XXX");    dataBo.setYyy("YYY");    boolean result = update(dataBO);    if(!result)        return;    dataBO = new DataBO();    dataBO.setId(23);    dataBO.setOneStatus(0);    dataBO.setTwoStatus(0);    result = update(dataBO);    if(!result)        return;    //插入数据    insert();}
update方法
public boolean update(DataBO dataBO){    return dataDAO.updateById(dataBO) > 0;}
BO
public class DataBO{    private Long id;    private int isDeleted;    private int oneStatus;    private int twoStatus;    private String xxx;    private String yyy;    private Date gmtCreated;    private Date gmtModified;}
mapper
update data_table set gmt_modified = now()
gmt_created = #gmtCreated#
gmt_modified = #gmtModified#
is_deleted = #isDeleted#
xxx = #xxx#
yyy = #yyy#
one_status = #oneStatus#
two_status = #twoStatus#
where id = #id#
·

分析定位

表象是,数据库里数据更新明明操作成功了,但插入失败了。

Debug无法复现,就打印了些日志来分析,结果是第二次更新没有成功,影响条数为0
copy日志中的sql去数据库客户端执行,操作成功:

update data_table set gmt_modified = now() ,one_status =0,two_status=0,where id = 23;

所以核心问题就是为什么程序里执行更新操作会时常失败。

排查发现:

  • 数据库update操作,当原数据库记录数据与传入参数没有任何变化时,不执行操作,影响记录数为0
  • 传入参数两个int属性,初始化时会被置为0,导致第二个update需要更新的字段都与数据库记录一致,isNotEmpty条件判断无意义
  • 成功失败的关键,在于now()的取值,若两次更新时间一样,则所有参数一致,更新失败。所以在客户端操作更新成功,debug拉开了时间差异,也会更新成功

这样一段逻辑,到处都是坑,但就是各种错误写法/用法聚集一起,才露出了这种“大新闻”的表象,只要一个条件不符合,这个问题的复杂程度都要降低很多,更容易排查。

比如,属性值类型不用int,或者检查方式更严谨,或者没有gmt_modified = now() 这个条件(哪怕是复制到客户端测试的时候没有这个条件,问题也都早就暴露出来了)……

转载于:https://www.cnblogs.com/coderzl/p/8304659.html

你可能感兴趣的文章
Vitamio中文API文档(4)—— VitamioInstaller
查看>>
yii框架常用url地址
查看>>
python3.4学习笔记(十六) windows下面安装easy_install和pip教程
查看>>
MyGUI 解析
查看>>
Linux中的ls命令详细使用
查看>>
graph-tool文档(一)- 快速开始使用Graph-tool - 2.属性映射、图的IO和Price网络
查看>>
easyui treegrid逐步加载
查看>>
GraphicsLab Project之辉光(Glare,Glow)效果 【转】
查看>>
<转>Python: __init__.py 用法
查看>>
Linux Curl命令
查看>>
046 SparlSQL中的函数
查看>>
-27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found...
查看>>
[LeetCode] Minimum Depth of Binary Tree
查看>>
,net运行框架
查看>>
Java 中 Emoji 的正则表达式
查看>>
Mixin Network第一届开发者大赛作品介绍- dodice, diceos和Fox.one luckycoin
查看>>
安卓Glide(4.7.1)使用笔记 01 - 引入项目
查看>>
中金易云:为出版社找到下一本《解忧杂货店》
查看>>
Flex布局
查看>>
Material Design之 AppbarLayout 开发实践总结
查看>>