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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 问题背景需求背景需求:对商品的上架与下架进行管控,下架的商品不能进行销售上架与下架的管控,在我负责的项目(单据系统)中实现;销售的控制则是在另外一个项目(POS系统)中实现的POS 系统定时地从单据系统中拉取数据,并对商品的销售进行控制单据系统设计了两张表:

问题背景

需求背景

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

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

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

单据系统设计了两张表:

网络异常,图片无法展示
|

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

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

部分数据未同步

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

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

网络异常,图片无法展示
|

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

我们来执行下更新操作

网络异常,图片无法展示
|

网络异常,图片无法展示
|

可以看到对 t_ware_on_off_bill 的更新结果是: 受影响的行: 0modify_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数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
116 0
|
23天前
|
SQL 关系型数据库 MySQL
MySQL异常一之: You can‘t specify target table for update in FROM clause解决办法
这篇文章介绍了如何解决MySQL中“不能在FROM子句中指定更新的目标表”(You can't specify target table for update in FROM clause)的错误,提供了错误描述、需求说明、错误做法和正确的SQL写法。
225 0
|
3月前
|
存储 SQL 关系型数据库
MySQL中的update操作与锁机制
本文探讨MySQL中`UPDATE`操作的自动加锁机制及其对数据一致性的保障作用。尤其在InnoDB存储引擎下,系统会在涉及索引的更新操作中加行锁或间隙锁,防止多事务并发修改同一条记录。通过福利码兑换系统的实例展示,当线程A开启事务更新库存时,线程B试图更新相同记录会被阻塞,直至线程A提交。此外,文章还介绍了乐观锁及版本号控制等策略进一步提升并发性能的方法。作者:小明爱吃火锅,来源:稀土掘金。
184 2
|
4月前
|
负载均衡 关系型数据库 MySQL
MySQL PXC集群多个节点同时大量并发update同一行
如本文标题,MySQL PXC集群多个节点同时大量并发update同一行数据,会怎样? 为此,本人做了一个测试,来验证到底会怎样!
52 0
|
5月前
|
供应链 关系型数据库 MySQL
MySQL的`FOR UPDATE`详解
MySQL的`FOR UPDATE`详解
120 0
|
6月前
|
SQL 存储 关系型数据库
深入理解MySQL中的UPDATE JOIN语句
MySQL的UPDATE JOIN语句用于根据关联表的条件更新数据。示例中,历史记录表有用户账号字段,新增列用于存储用户名。通过UPDATE JOIN,一次性将账号转换为用户名。关键点包括准确的连接条件、谨慎使用WHERE子句以及在更新前进行测试。此操作提高了数据处理效率,但也需小心操作以防止数据错误。
198 4
深入理解MySQL中的UPDATE JOIN语句
|
5月前
|
关系型数据库 MySQL 数据库
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
78 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL优化(3/3)-limit 优化、count 优化、update 优化、SQL优化 小结
MySQL数据库——SQL优化(3/3)-limit 优化、count 优化、update 优化、SQL优化 小结
299 0
|
6月前
|
Oracle 关系型数据库 MySQL
【MySQL】8. 基本查询(update/delete/聚合/分组)
【MySQL】8. 基本查询(update/delete/聚合/分组)
58 0
|
6月前
|
关系型数据库 MySQL 测试技术
MySQL中,当update修改数据与原数据相同时会再次执行吗
MySQL中,当update修改数据与原数据相同时会再次执行吗
39 0