时间戳和MySQL的DateTime带来的线上BUG

时间戳和MySQL的DateTime带来的线上BUG

问题背景

团队规定:服务端对外接口无论是接收还是返回,对于时间都是要时间戳,且毫秒格式,内部数据库存储建议BIGINT,而有人用了DateTime,导致了线上一个对接业务出现了时间戳校验失败的BUG。

BUG复现

  1. 外部接口首先请求接口A(实现了幂等),传了一个毫秒级别的时间戳和其他业务参数,如1538284559999(北京时间2018-09-30 13:15:59.999),;
  2. 系统接收到参数后,将时间戳转换为Date类型,存入数据库;
  3. 外部接口再次调用接口A,传了相同的参数,包括时间戳1538284559999,返回错误,而非期望的幂等成功。

BUG定位

经过查看日志等工作,发现mysql在存储1538284559999时进行了四舍五入,成了2018-09-30 13:16:00,系统再次拿出该时间戳时就成了1538284560000,这!根本没法对比啊!
为什么呢?
为什么mysql会对毫米级时间戳进行四舍五入呢?正常来说,无论是DateTime还是Timestamp,都可以存储毫秒级别的时间,于是搜索了一番,查找到一个博客如下:
时间戳和MySQL的DateTime带来的线上BUG

BUG修复

将数据库的Datetime修改为Datetime(3)即可。