开心一刻

  老婆痛经,躺在沙发上,两岁的女儿看着她问道

  女儿:妈妈,你怎么了

  老婆:妈妈肚子痛

  女儿:哦,妈妈你头疼

  老婆:不是头疼,妈妈是肚子疼

  女儿用她的不锈钢饭碗砸向老婆的额头,说道:妈妈,你哪里疼

  老婆:头疼,头疼

  老婆幽怨的看着我,说道:这姑娘随你还是随我

  我低着头,小声地说道:我都被你欺负成啥样了,你说姑娘随谁?

问题背景

  需求背景

  需求:对商品的上架与下架进行管控,下架的商品不能进行销售

    上架与下架的管控,在我负责的项目(单据系统)中实现;销售的控制则是在另外一个项目(POS系统)中实现

    POS 系统定时的从单据系统中拉取数据,并对商品的销售进行控制

  单据系统设计了两张表:

DROP TABLE IF EXISTS t_ware_on_off_bill;
CREATE TABLE `t_ware_on_off_bill` (
`id` BIGINT(19) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`bill_code` VARCHAR(45) NOT NULL COMMENT '单据编号',
`bill_type` TINYINT(2) NOT NULL DEFAULT 1 COMMENT '单据类型(1=下架,2=上架)',
`bill_status` TINYINT(2) NOT NULL COMMENT '单据状态(1=草稿,2=已提交,3=审核中,4=已生效,5=已取消)',
`is_delete` TINYINT(2) NOT NULL DEFAULT '2' COMMENT '是否删除标识(1-是,2-否)',
`note` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '备注',
`create_user` BIGINT(19) NOT NULL COMMENT '创建人id',
`create_time` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`modify_user` BIGINT(19) NOT NULL COMMENT '最终修改人',
`modify_time` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '最终修改时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB COMMENT='商品上架下架单'; DROP TABLE IF EXISTS t_ware_on_off_bill_detail;
CREATE TABLE `t_ware_on_off_bill_detail` (
`id` BIGINT(19) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`bill_id` BIGINT(19) NOT NULL COMMENT '商品上架下架单的id',
`ware_code` BIGINT(19) NOT NULL COMMENT '商品编号',
`note` VARCHAR(255) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB COMMENT='商品上架下架单明细';

  实际上,表的字段不止这么多,但因为表的字段的多少不影响问题的出现,所以也就简化了表结构

  下游系统根据 modify_time 定时进行数据的增量同步( t_ware_on_off_bill 和 t_ware_on_off_bill_detail 都会进行更新)

  部分数据未同步

  结果出现了部分数据未同步的情况

  先来复现下问题,初始数据如下

  此时的 modify_time 的值是 2021-09-08 21:18:52.602

  我们来执行下更新操作

  可以看到对 t_ware_on_off_bill 的更新结果是: 受影响的行: 0 , modify_time 并未进行更新,其值仍是 2021-09-08 21:18:52.602

  但是 t_ware_on_off_bill_detail 是实实在在存在更新的

  这就导致下游系统通过 modify_time 没有增量同步最新的商品明细

  问题来了:明明对 t_ware_on_off_bill 的 N 个字段进行了 SET 操作,为什么没有记录受影响(modify_time 为什么不更新)

探究真相

  我相信此时很多小伙伴都认为楼主是这个

  菜不可怕,怕的是我们不敢面对它;有问题,我们就去找原因,然后解决它(菜的好理直气壮...)

  追查原因

  其实 MySQL 官方文档中有说明:11.2.6 Automatic Initialization and Updating for TIMESTAMP and DATETIME

  两种情况会进行自动更新成系统当前时间

    1、insert 行时,该列没有值

    2、该行的任意列的值改变了

  此时,相信大家都知道原因了吧

  虽然这个 SQL 很长,SET 了好几个字段,但是不满足上述两点中的任意一点,那么 modify_time 也就不会更新成系统当前时间了

  解决问题

  原因是找到了,如何解决问题了?

  官方文档里面也说明了,显示的设值,也就是我们显示的指定 modify_time 的值,像这样

  我们来看看实际结果

  当然,解决方案不止这一种,各位可以在评论区畅所欲言

总结

  1、MySQL 自动设置成系统当前时间是有条件的,否则是不会更新的哦

    insert 行时,该列没有值

    该行的任意列的值改变了

  2、给大家留个疑问:为什么要有任意列的值改变了,MySQL 才会自动更新 modify_time 成当前系统时间,而不是只要有 SET 就更新 modify_time 成当前系统时间

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知的更多相关文章

  1. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  2. 解Bug之路-记一次线上请求偶尔变慢的排查

    解Bug之路-记一次线上请求偶尔变慢的排查 前言 最近解决了个比较棘手的问题,由于排查过程挺有意思,于是就以此为素材写出了本篇文章. Bug现场 这是一个偶发的性能问题.在每天几百万比交易请求中,平均 ...

  3. 线上BUG:MySQL死锁分析实战

    原文链接:线上BUG:MySQL死锁分析实战 1 线上告警 我们不需要关注截图中得其他信息,只要能看到打印得org.springframework.dao.DeadlockLoserDataAcces ...

  4. 记一次线上MySQL数据库死锁问题

            最近线上项目报了一个MySQL死锁(DealLock)错误,虽说对业务上是没有什么影响的,由于自己对数据库锁这块了解不是很多,之前也没怎么的在线上碰到过.这次刚好遇到了,便在此记录一下 ...

  5. 【MySQL】记一次线上重大事故:二狗子竟然把线上数据库删了!!

    写在前面 估计二狗子这几天是大姨夫来了,心情很郁闷,情绪也很低落,工作的时候也有点心不在焉.让他发个版本,结果,一行命令下去把线上的数据库删了!你没听错:是删掉了线上的数据库!运营那边顿时炸了锅:怎么 ...

  6. 线上任务的mysql 重启

    我们的业务是 所使用的数据库是 自己搭建的mysql-server-5.05, 服务器 红帽子6.0. 考虑到 服务的稳定性,计划将数据库向dba进行迁移,由他们进行维护.dba的迁移计划是 1 先创 ...

  7. 记一次线上Curator使用过程JVM栈溢出解决

       为了同学们看起来一目了,特按如下思路进行讲解. 1.出现的场景    2.分析及解决的过程    3.总结 最近公司要使用zookeeper做配置管理(后面简称ZK),然后自己就提前用虚拟机进行 ...

  8. 记一次线上coredump事故

    1.事故背景 上周三凌晨,我负责的某个模块在多台机器上连续发生coredump,幸好发生在业务低峰期,而且该模块提供的功能也不是核心流程功能,所以对线上业务影响比较小.发生coredump后,运维收到 ...

  9. 记一次线上事故的JVM内存学习

    今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务.最后运维大神各种倒腾内存,GC稳定后,服务正常.虽说全程在打酱油,但是也跟着学习不少的东西. 第一个问题:为什么 ...

随机推荐

  1. JSON数据的HTTP Header应该怎么标记?

    第一种 header('Content-type: application/json'); 另一种 header('Content-type: text/json');

  2. [ZJOI2010]基站选址,线段树优化DP

    G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较   题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...

  3. SpringCloud升级之路2020.0.x版-7.从Bean到SpringCloud

    本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ 在理解 Spr ...

  4. Thunder DLL Hijacking

    简记 原理基础啥的俺也不写了 1.寻找DLL 生成恶意dll文件 拿calc测试 2.放入 3.打开

  5. 只要套路对,薪资直接翻一倍!保姆级Android面试葵花宝典,肝完面试犹如开挂

    跳槽,这在 IT 互联网圈是非常普遍的,也是让自己升职加薪,走上人生巅峰的重要方式.那么作为一个普通的Android程序猿,我们如何才能斩获大厂offer 呢? 疫情向好.面试在即,还在迷茫踌躇中的后 ...

  6. matlab快速入门

    matlab快速入门 1矩阵 生成矩阵 ​ % 直接法 a = [1,2,3;4,5,6;7,8,9]; % 冒号一维矩阵 a = 开始:步长:结束,步长为1可省略 b = 1:1:10; % 1,2 ...

  7. 01 CTF从0到。。。。

    无意间在前段时间接触到了CTF,感觉很有意思,就参加了个单位的短期培训,并且参加了比赛,也是无意混进了决赛.感觉自己不会的还很多!SO,开始写博客开始刷题,自己很菜,不会C,不会Python,不会汇编 ...

  8. 【原创】利用动态二进制加密实现新型一句话木马之PHP篇

    概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...

  9. Docker++:从 0 到 1 学习Docker(笔记)

    本篇文章有点长 ... 知识点如下:下 ↓ ↓ ↓ ~ 初识 Docker  ~ Docker 命令 ~ Docker 容器的数据卷 ~ Docker 应用部署 ~ Dockerfile ~ Dock ...

  10. Mysql使用存储过程快速添加百万数据

    前言 为了体现不加索引和添加索引的区别,需要使用百万级的数据,但是百万数据的表,如果使用一条条添加,特别繁琐又麻烦,这里使用存储过程快速添加数据,用时大概4个小时. 创建一个用户表 CREATE TA ...