记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

开心一刻

我妻子痛经了,正躺在沙发上。她两岁的女儿看着她问。

[En]

My wife had dysmenorrhea and was lying on the sofa. Her two-year-old daughter looked at her and asked.

女儿:妈妈,你怎么了

老婆:妈妈肚子痛

女儿:哦,妈妈你头疼

妻子:这不是头疼。妈妈肚子疼。

[En]

Wife: it’s not a headache. Mom has a stomachache.

女儿用她的不锈钢饭碗打妻子的额头,说:妈妈,哪里疼?

[En]

The daughter hit her wife on the forehead with her stainless steel rice bowl and said, Mom, where does it hurt?

老婆:头疼,头疼

我的妻子痛苦地看着我说:“这个女孩可以做任何你想做的事,也可以跟着我。”

[En]

My wife looked at me bitterly and said, “this girl can do whatever you want or follow me.”

我低下头,低声说:“我被你欺负了。你想要谁当女孩?”

[En]

I bowed my head and whispered, “I’ve been bullied by you. Who do you want to be a girl?”

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

问题背景

需求背景

需求:控制商品上下架,下架商品不能卖。

[En]

Demand: control the goods on and off the shelves, and the goods off the shelves cannot be sold.

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

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

MySQL 版本: 5.7.20 -log

单据系统设计了两张表:

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知
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='商品上架下架单明细';

View Code

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

事实上,表中有更多的字段,但由于表中字段的数量不影响问题的发生,所以简化了表结构。

[En]

In fact, there are more than that in the table, but because the number of fields in the table does not affect the occurrence of the problem, the table structure is simplified.

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

部分数据未同步

因此,一些数据不会同步。

[En]

As a result, some of the data are not synchronized.

让我们先重现这个问题。初值数据如下。

[En]

Let’s reproduce the problem first. The initial data are as follows.

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

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

我们来执行下更新操作

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

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

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

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

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

探究真相

相信在这个时候,很多朋友都认为房东是这样的。

[En]

I believe that at this time, many friends think that the landlord is this.

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

食物不可怕,可怕的是我们不敢面对;如果有问题,我们会找到原因并加以解决。

[En]

The food is not terrible, the fear is that we dare not face it; if there is a problem, we will find the cause and solve it.

追查原因

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

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

这两种情况都会自动更新为系统的当前时间

[En]

Both cases are automatically updated to the current time of the system

1、insert 行时,该列没有值

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

在这一点上,我相信每个人都知道原因。

[En]

At this point, I believe everyone knows why.

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

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

解决问题

原因是我们已经找到了,如何解决问题呢?

[En]

The reason is that we have found it, how to solve the problem?

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

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

我们来看看实际结果

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

当然,解决方案不止一个,你可以在评论区畅所欲言。

[En]

Of course, there is more than one solution, and you can speak freely in the comments area.

总结

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

insert 行时,该列没有值

该行的任意列的值改变了

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

Original: https://www.cnblogs.com/youzhibing/p/15186607.html
Author: 青石路
Title: 记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508169/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • servlet映射路径匹配解析

    开头 servlet是javaweb用来处理请求和响应的重要对象,本文将从源码的角度分析tomcat内部是如何根据请求路径匹配得到处理请求的servlet的 假设有一个reques…

    数据库 2023年6月16日
    080
  • ReentrantLock可重入、可打断、Condition原理剖析

    本文紧接上文的AQS源码,如果对于ReentrantLock没有基础可以先阅读我的上一篇文章学习ReentrantLock的源码 重入加锁其实就是将AQS的state进行加一操作 …

    数据库 2023年6月11日
    073
  • Java Script 原型链原理与继承

    所有对象都有隐式原型; 原型也是对象,也有隐式原型. function User() {}console.log(User.prototype); function User() …

    数据库 2023年6月11日
    063
  • SQL 基础

    在平时的工作中,大家可能是 ORM 战士。但是 ORM 之下,还是原生的 SQL。这是整理 SQL 基础时的一些记录。 数据定义语言,用来定义数据库对象,包括数据库、数据表和列。 …

    数据库 2023年6月16日
    079
  • QQ登录简介

    QQ登录简介 (1) QQ登录 QQ登录,亦即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目。 若想实现QQ登录,需要成为QQ互联的…

    数据库 2023年6月14日
    064
  • WIN10下启动VMware虚拟机蓝屏的解决办法

    问题: 每次启动虚拟机就会蓝屏,提示错误代码: PAGE_FAULT_IN_NONPAGED_AREA 解决办法: 禁用 Hyper-V 功能 打开”控制面板&#821…

    数据库 2023年6月14日
    078
  • 【Java代码之美】 — Java11新特性解读

    1.背景 美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。非常值得大家的关注,可以通过下面的地址进行下载: h…

    数据库 2023年6月6日
    083
  • JavaScript基本知识点——带你逐步解开JS的神秘面纱

    JavaScript基本知识点——带你逐步解开JS的神秘面纱 在我们前面的文章中已经深入学了HTML和CSS,在网页设计中我们已经有能力完成一个美观的网页框架 但仅仅是网页框架不足…

    数据库 2023年6月14日
    092
  • Redis集群(三)集群模式

    一、 集群的作用 集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。 集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点…

    数据库 2023年6月11日
    075
  • 如何使用Java代码修改数组大小呢?

    数组是Java开发中非常重要的一个数据存储容器, 那可以存储多种类型,基础类型,引用类型,但是它有一个缺点,就是一旦创建后,就不可以修改数组的大小, 那么我们如何动态的扩容数组的大…

    数据库 2023年6月11日
    091
  • Java绘图基础

    Graphics 绘图类 Graphic是一个抽象的画笔对象,可以在组件上绘制丰富多彩的几何图形和位图。Graphics类封装了Java支持的基本绘图操作所需的属性,主要包括 颜色…

    数据库 2023年6月16日
    073
  • 1_MySQL

    概念: 数据库是按照数据结构来组织, 存储和管理数据的仓库, 是一个长期存储在计算机内的, 有组织的, 有共享的, 统一管理的数据集合 分类: 网状结构数据库: 美国通用汽车公司I…

    数据库 2023年6月11日
    058
  • Figma 快捷键

    作用 WINDOWS MAC 窗口切换到Home Ctrl + 1 Cmd + 1 窗口切换到打开的第一个文件 Ctrl + 2 Cmd + 2 打开菜单搜索 Ctrl + / C…

    数据库 2023年6月6日
    082
  • 【Java基础】 — Java遍历List四种方法的效率对比 【转载】

    1.遍历方法简介 Java遍历List的方法主要有四种: *for each *Iterator *loop without size *loop with size 注:这里我们…

    数据库 2023年6月6日
    0112
  • Android Studio更改SDK、Gradle以及模拟器默认下载位置

    版本:Android Studio Chipmunk | 2021.2.1 Patch 2时间:2022年9月1日 1、更改SDK位置 找到 File -> Settings…

    数据库 2023年6月16日
    081
  • Docker 启动各个应用

    MySQL docker run -p 3306:3306 –name mysql -v /usr/mydata/mysql/log:/var/log/mysql -v /usr…

    数据库 2023年6月6日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球