服务器时间与数据库时间未同步产生的bug

最近接了个做投票网站的活,每人每天可以投票3次。查数据时,突然发现有人在零点的时候投了几百张票!有人在搞事情呀!查了半天才发现服务器和数据库时间不一致,然后检查每人每天限制时,又分别查了两个地方!

投票设计

1. 数据库

vote表里,每投一次票,就插入一条数据

#只是个伪代码,示意一下
insert into vote(id,user_id,team_id,create_time)

2. 每天一个人限制三次

插入前,先统计一下,这个人投票次数

#就是查询下,当前时间的天,该用户投票数据的统计
select count(0) from vote v where v.user_id = :userId and to_days(v.create_t) = to_days(now())

被刷票了!

查下数据,发现有个人短短几天内投了几百张票!看数据库记录还都是零点前的2分钟内。11:58-00:00 这个时间段。 奇怪了,反复检查代码,认为不可能出错。然后...在服务器上执行下

date
Mon Jul  9 15:06:35 CST 2018

好像比我的电脑慢了2分钟,再在数据库执行下

select NOW();

一对比,服务器比数据库慢了2分钟!

然后就明白了,数据库里的create_time是用代码new Date()的,是服务器时间,所以,记录是11:58分,实际上,已经过了0点了。那么这个时间段内执行的

解决

  1. 代码层面上,插入时间使用数据库时间!

  2. 把服务器和数据库时间同步一下。

最后我只是把服务器时间和网络时间同步了一下。 执行的命令:

参考:https://www.chenyudong.com/archives/linux-ntpdate-time-synchronize.html

以后一定要注意服务器时间和数据库时间的问题,其实不止这些!有些东西的判断标准必须统一!

最后更新于

这有帮助吗?