問題描述
mysql中對於UPDATE_TIME字段我們有時候會設置ON UPDATE CURRENT_TIMESTAMP,表示在數據庫數據有更新的時候UPDATE_TIME的時間會自動更新(如果數據庫數據值沒有變化的話,UPDATE_TIME是不會自動更新的)。那么假設一個場景,我們有一個長事務有10秒,在進入事務第2秒的時候我們執行了一個update操作,然后往下繼續執行,直到第10秒,事務提交。此時數據庫記錄的時間是執行update的時候的第2秒的時間點呢?還是事務提交后的第10秒的時間點?
驗證結果
事務提交完成后,保存到數據庫的時間是執行update的第2秒的時間點。
場景限制
如果UPDATE_TIME只是用來記錄更新時間,那么這個自動更新的時間點倒是沒有什么影響。但是如果想要用UPDATE_TIME來作為數據同步(比如同步到另一個庫,或者es之類的)的依據,那么就不能夠這樣定義。因為我們使用UPDATE_TIME作為更新,一般也是要求准實時同步,假如一個事務比較長,在事務還沒提交過程中我們已經記錄了更新的時間,等事務提交后,這個UPDATE_TIME的時間我們是沒有同步到的。舉個栗子:
一個長事務的開始時間為12:00:00,結束時間為12:00:10,
在12:00:02的時候執行了update操作,此時數據庫的UPDATE_TIME的時間還是12:00:00,因為事務還沒提交。
與此同時有個定時任務在掃描這段時間內的數據,比如12:00:00到12:00:03,沒有數據,因此將12:00:03記錄下來,下次從這個時間點繼續往后掃描,等12:00:10時長事務提交,此時數據庫中該條數據的UPDATE_TIME值為12:00:02,但是定時任務掃描不會再掃描中這條數據了,就會導致同步數據不完整。對這種情況,我們只能夠在程序中進行設置UPDATE_TIME的值,而不應該通過數據庫本身設置ON UPDATE CURRENT_TIMESTAMP