mysql datetime類(lèi)型字段存入時(shí)間多了1秒導(dǎo)致的問(wèn)題

一诗力、問(wèn)題描述

商城系統(tǒng)今天上線(xiàn)了一個(gè)功能烙心,用戶(hù)在商城中點(diǎn)擊商品詳情頁(yè)的去購(gòu)買(mǎi)按鈕時(shí),如果商品是有代金券優(yōu)惠活動(dòng)的商品选泻,則會(huì)先領(lǐng)券后計(jì)算商品金額冲粤。 這里面涉及到兩步操作:調(diào)用領(lǐng)券接口,領(lǐng)券成功后页眯,調(diào)用計(jì)算接口(計(jì)算商品價(jià)格接口)梯捕,計(jì)算接口內(nèi)部會(huì)調(diào)用代金券查券接口。遇到問(wèn)題是窝撵,發(fā)券后傀顾,立即調(diào)用代金券查詢(xún)代金券,查詢(xún)不到剛發(fā)的代金券碌奉,停幾秒中再去查短曾,就可以查到,這種情況大概率會(huì)復(fù)現(xiàn)赐劣。

很奇怪的問(wèn)題嫉拐,代金券系統(tǒng)已經(jīng)很久沒(méi)有修改過(guò)了,線(xiàn)上也未爆出過(guò)發(fā)了代金券而查詢(xún)不到的情況魁兼。

二婉徘、問(wèn)題排查


一開(kāi)始以為是數(shù)據(jù)庫(kù)主從延遲導(dǎo)致的,把代金券查詢(xún)接口日志打開(kāi)咐汞,發(fā)現(xiàn)dao從庫(kù)中查詢(xún)時(shí)是可以查到剛發(fā)送的券盖呼,但是進(jìn)行規(guī)則過(guò)濾后,代金券被過(guò)濾了化撕,添加詳細(xì)的日志几晤,發(fā)現(xiàn)代金券是被有效期校驗(yàn)給過(guò)濾了。

代金券的有效期校驗(yàn)是:當(dāng)前時(shí)間 >= 代金券創(chuàng)建時(shí)間 and 當(dāng)前時(shí)間 <= 代金券結(jié)束時(shí)間

代金券有效期一般都是從發(fā)券時(shí)間開(kāi)始植阴,到發(fā)券時(shí)間+7天锌仅,因此當(dāng)前時(shí)間必然<代金券結(jié)束時(shí)間章钾,那么就是當(dāng)前時(shí)間小于創(chuàng)建時(shí)間導(dǎo)致過(guò)濾,這就更奇怪了热芹,發(fā)券在前贱傀,查詢(xún)?cè)诤螅樵?xún)時(shí)伊脓,系統(tǒng)時(shí)間應(yīng)該是大于代金券創(chuàng)建時(shí)間的府寒,為什么會(huì)被過(guò)濾呢。

查看數(shù)據(jù)庫(kù)記錄报腔,發(fā)現(xiàn)一個(gè)奇怪的問(wèn)題,代金券createtime居然比updatetime多了1s:

createTime updateTime
2021-07-01 14:18:42 2021-07-01 14:18:41


心理隱約感覺(jué)找到了方向株搔。繼續(xù)查看代金系統(tǒng)的日志,發(fā)現(xiàn)創(chuàng)建日志打印時(shí)間為:2021-07-01 14:18:41.529纯蛾, 而查詢(xún)代金券的時(shí)間為2021-07-01 14:18:41.611纤房。
這大概就找到問(wèn)題了,createTime入庫(kù)時(shí)間比系統(tǒng)時(shí)間多了1秒翻诉,導(dǎo)致2021-07-01 14:18:41.611 < 2021-07-01 14:18:42炮姨。那么為什么入庫(kù)時(shí)間會(huì)多1秒呢?

查看代金券createTime設(shè)值的代碼:

setCreateTime(new Date());

取的是當(dāng)前系統(tǒng)時(shí)間碰煌,而updateTime其值不是由java代碼設(shè)置的舒岸,而是設(shè)置了默認(rèn)值,也就時(shí)入庫(kù)時(shí)芦圾,會(huì)取mysql current time蛾派。
看下createtime和updatetime的sql定義:

`create_time` datetime(0)  DEFAULT '0000-00-00 00:00:00' COMMENT '創(chuàng)建時(shí)間',
  `last_update_time` timestamp(0)  DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '最后更新時(shí)間',

發(fā)現(xiàn)兩個(gè)字段的類(lèi)型居然不一致,createTime是datetime(0)類(lèi)型,表示時(shí)間會(huì)精確到秒个少,而updateTime是timestamp(0)洪乍。

百度一番,發(fā)現(xiàn)這居然是mysql的一個(gè)bug夜焦, 當(dāng)時(shí)間字段類(lèi)型為datetime時(shí)壳澳,如果時(shí)間毫秒數(shù)小于500時(shí),向下舍糊探,如果大于等于500時(shí)向上加1秒,也就是:

2021-07-01 14:18:41.400 會(huì)存為2021-07-01 14:18:41
2021-07-01 14:18:41.591 會(huì)存為2021-07-01 14:18:42

參考:
https://wuxiangknow.cn/mysql/%E5%85%B3%E4%BA%8EMysql5.7%E5%AD%98%E5%82%A8%E6%97%B6%E9%97%B4%E5%A4%9A%E4%B8%80%E7%A7%92%E7%9A%84BUG/


線(xiàn)上之所以一直未爆出這個(gè)問(wèn)題河闰,主要是沒(méi)有這種領(lǐng)券后科平,在極短時(shí)間(500ms內(nèi))就去查券的場(chǎng)景,而商城這個(gè)場(chǎng)景是自動(dòng)發(fā)券自動(dòng)查姜性,間隔時(shí)間基本上100ms以?xún)?nèi)瞪慧,才爆出這個(gè)問(wèn)題。

三部念、問(wèn)題解決

解決辦法有3個(gè):

  1. 查詢(xún)判斷時(shí)弃酌,取當(dāng)前時(shí)間時(shí)氨菇,加1s
  2. 存datetime類(lèi)型的字段時(shí),對(duì)Date類(lèi)型的值進(jìn)行處理妓湘,將毫秒置為000查蓉,比如2021-07-01 14:18:41.400 設(shè)置為2021-07-01 14:18:41.000
  3. 將mysql時(shí)間類(lèi)型改為datetime(3),或者timestamp類(lèi)型。

推薦第二種榜贴,因?yàn)榈?種并沒(méi)有解決根本問(wèn)題豌研,存入的數(shù)據(jù)本身就是錯(cuò)的,保不齊其他地方也會(huì)有日期判斷的地方唬党,如果數(shù)據(jù)存入的就是錯(cuò)的鹃共,其他地方判斷也會(huì)是錯(cuò)的。而第3種需要修改數(shù)據(jù)庫(kù)字段類(lèi)型驶拱,公司內(nèi)對(duì)數(shù)據(jù)量大的表進(jìn)行修改比較麻煩霜浴,而且時(shí)間精確到毫秒意義并不大,還會(huì)占用更多的空間蓝纲,不如修改兩行代碼來(lái)的快捷阴孟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驻龟,隨后出現(xiàn)的幾起案子温眉,更是在濱河造成了極大的恐慌,老刑警劉巖翁狐,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件类溢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡露懒,警方通過(guò)查閱死者的電腦和手機(jī)闯冷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)懈词,“玉大人蛇耀,你說(shuō)我怎么就攤上這事】餐洌” “怎么了纺涤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)抠忘。 經(jīng)常有香客問(wèn)我撩炊,道長(zhǎng),這世上最難降的妖魔是什么崎脉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任拧咳,我火速辦了婚禮,結(jié)果婚禮上囚灼,老公的妹妹穿的比我還像新娘骆膝。我一直安慰自己祭衩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布阅签。 她就那樣靜靜地躺著掐暮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愉择。 梳的紋絲不亂的頭發(fā)上劫乱,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音锥涕,去河邊找鬼衷戈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛层坠,可吹牛的內(nèi)容都是我干的殖妇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼破花,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谦趣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起座每,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤前鹅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后峭梳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舰绘,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年葱椭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捂寿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孵运,死狀恐怖秦陋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情治笨,我是刑警寧澤驳概,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站旷赖,受9級(jí)特大地震影響顺又,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杠愧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一待榔、第九天 我趴在偏房一處隱蔽的房頂上張望逞壁。 院中可真熱鬧流济,春花似錦锐锣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至糖声,卻和暖如春斤彼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蘸泻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工琉苇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悦施。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓并扇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抡诞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穷蛹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容