线上业务修改时间小于创建时间问题回顾

2024-06-12 23:38

本文主要是介绍线上业务修改时间小于创建时间问题回顾,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

某一天偶然发现生产库某个业务存在修改时间modify_at小于创建时间create_at的数据:

开发环境当时没有,后来也有了:

按理modify_at不可能比create_at小。

 

开始排查

首选确定了数据是用户录入的,不是导入的,另外没有改过数据,找到接口后,代码如是:

代码中通过id判断是不是新数据,进而区别设置创建时间和修改时间,不会有问题。当时比较匪夷所思,不知道这样的数据是怎么来的,后来测试同事复现了,发现前端在新增有时会传入modify_at

 

确定问题原因

新增时前端有时会传create_at和modify_at,传create_at没关系,服务端会重置,传modify_at就可能出现modify_at<create_at,因为新增时没对modifyAt重置,导致用了前端传的modify_at。如果再编辑这条数据,modfiyAt会恢复正常,因为服务端会重置。

 

讨论

为什么前端会传createAt和modifyAt,因为把这个两个字段暴露给了前端,是否不应该在VO中暴露createAt和modifyAt给前端?当时是回查的时候用于显示,不过前端确实没有用到。

另外验证了`create_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `modify_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间' 的设置,表名如果提交到数据库服务器的数据没有创建时间,用数据库服务器的时间,如果没有更新时间,也用数据库服务器的时间,如果执行了update,默认将更新时间更新为此刻数据库服务器时间。把本地电脑时间改掉,观察create_at和modify_at用的是什么时间,结果表明如果最后提交到数据库的数据有时间,会用数据中的时间,这个时间可能来自本地电脑,可能是前端传了。服务端传的话是可以的,前端传就有问题了。所以归根结底,前端不应该传create_at和modify_at。

最后一点,接口录入上也要规范,不应该把createAt和modifyAt写出来,当时报酬新增接口是没有写的,前端同事没有严格按照接口说明联调。

你们对这个问题怎么看呢,欢迎留言讨论哈。

这篇关于线上业务修改时间小于创建时间问题回顾的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055670

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解