在业务逻辑中经常会涉及到需要记录某个事件发生的时间,这个时间通常是取当前的时间,那么这个时候有两个选择,是在应用层还是在数据库层来设置这个时间呢?
如果在应用层设置的话,每次都需要进行一次设置,可能会觉得麻烦就将这个设置时间放在了数据库层在插入的时候使用now()来进行设置,但是这样是可能会留下隐患的。
对于在数据库层进行设置的话,假设这么一个场景:
我们需要这个事件发生的时间,比如我们需要使用这个发生时间进行排序,需要精确到毫秒的那种,当然这个时候datetime已经没办法满足我们的需求了,最好使用时间戳格式的。
首先插入A记录,从应用服务器向数据库服务器发出 insert into t_foo (...,createtime,...) values (...,now(),...) 之类的语句,紧接着下一行代码就插入了B记录,同样的也是insert into t_foo (...,createtime,...) values (...,now(),...) ,在理想的情况下A语句先到达先执行,然后B语句再到达再执行,但是现实往往是很骨感的,生产环境中往往是应用程序所在的服务器和数据库所在的服务器不在同一台机器上,这个时候语句就需要在网络上进行传输,一旦这玩意儿到了网络上,我们就很难保证什么了,比如稍微发生一点网络抖动,可能B语句就会先于A语句到达数据库服务器而先执行,这个时候如果我们要依赖这个创建时间进行排序的话B就会排在A前面,并且我们没有任何证据可以表明A确实是发生在B之前的,这个就有点尴尬了,所以想了半天总结了一下:什么时候发生的事件,在发生的一瞬间就将那刻的时间记录打戳,迟则生变,杜绝拖延症。
2017-3-11 00:04:37 补充:
最近挺火的阿里Java开发规范中也提到了表必备三字段:
选择设置字段值的时候一定要考虑清楚,以后这个字段会拿来做什么。