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

简介: 问题背景需求背景需求:对商品的上架与下架进行管控,下架的商品不能进行销售上架与下架的管控,在我负责的项目(单据系统)中实现;销售的控制则是在另外一个项目(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 成当前系统时间

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
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
329 0
|
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写法。
2510 0
|
存储 SQL 关系型数据库
MySQL中的update操作与锁机制
本文探讨MySQL中`UPDATE`操作的自动加锁机制及其对数据一致性的保障作用。尤其在InnoDB存储引擎下,系统会在涉及索引的更新操作中加行锁或间隙锁,防止多事务并发修改同一条记录。通过福利码兑换系统的实例展示,当线程A开启事务更新库存时,线程B试图更新相同记录会被阻塞,直至线程A提交。此外,文章还介绍了乐观锁及版本号控制等策略进一步提升并发性能的方法。作者:小明爱吃火锅,来源:稀土掘金。
734 2
|
SQL 存储 关系型数据库
深入理解MySQL中的UPDATE JOIN语句
MySQL的UPDATE JOIN语句用于根据关联表的条件更新数据。示例中,历史记录表有用户账号字段,新增列用于存储用户名。通过UPDATE JOIN,一次性将账号转换为用户名。关键点包括准确的连接条件、谨慎使用WHERE子句以及在更新前进行测试。此操作提高了数据处理效率,但也需小心操作以防止数据错误。
794 4
深入理解MySQL中的UPDATE JOIN语句
|
负载均衡 关系型数据库 MySQL
MySQL PXC集群多个节点同时大量并发update同一行
如本文标题,MySQL PXC集群多个节点同时大量并发update同一行数据,会怎样? 为此,本人做了一个测试,来验证到底会怎样!
191 0
|
供应链 关系型数据库 MySQL
MySQL的`FOR UPDATE`详解
MySQL的`FOR UPDATE`详解
1085 0
|
关系型数据库 MySQL 数据库
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
475 0
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL优化(3/3)-limit 优化、count 优化、update 优化、SQL优化 小结
MySQL数据库——SQL优化(3/3)-limit 优化、count 优化、update 优化、SQL优化 小结
541 0
|
Oracle 关系型数据库 MySQL
【MySQL】8. 基本查询(update/delete/聚合/分组)
【MySQL】8. 基本查询(update/delete/聚合/分组)
158 0
|
关系型数据库 MySQL 测试技术
MySQL中,当update修改数据与原数据相同时会再次执行吗
MySQL中,当update修改数据与原数据相同时会再次执行吗
128 0

推荐镜像

更多