髒數據和時間戳,還有數據一致性校驗

    今天在開發補貨管理模塊時,要新增長一個接口,功能是能夠修改補貨管理表裏的訂單狀態。 php

    在數據庫裏,由一個orderStatus字段來表示訂單的當前狀態,而這個狀態能夠由兩種用戶角色進行修改。一個是加工廠,另外一個是供應商。以前在寫方法的時候,還沒體會到數據一致性的問題。可是昨天由老歐寫了一個接口給我看了以後,發現比我寫的方法多用到了表裏的lastModifiedOn和modifiedBy字段。來校驗數據。內心有些疑惑,就讓他給我講講這方面的東西。 前端

    他說:A在修改狀態的時候,從前端獲取到的狀態是1,要將其修改爲3.可是在這個過程當中,B用戶已經把狀態修改爲2了,那麼,A獲取到的狀態1,就成爲髒數據。: 數據庫

髒數據在臨時更新(髒讀)中產生。事務A更新了某個數據項X,可是因爲某種緣由,事務A出現了問題,因而要把A回滾。可是在回滾以前,另外一個事務B讀取了數據項X的值(A更新後),A回滾了事務,數據項恢復了原值。事務B讀取的就是數據項X的就是一個「臨時」的值,就是髒數據。

    在項目裏:整個業務流程由spo.tpl    spo.controller.php    spo.SCA.php    spo.model.php 組成。 spa

tpl顯示數據,controller組織數據,SCA發佈接口,model實現接口。A用戶在修改tpl上顯示的數據的時候,一塊兒取到了<input type="hidden" value="{$lastModifiedOn}"}裏面的$lastModifiedOn的值爲10:00,而SCA裏在準備對訂單狀態進行修改的時候,先從數據庫裏取出$lastModifiedOn,和傳進來的時間戳進行比對,若是二者一致,證實數據一致性沒有問題。這時再進行修改。若是兩個時間戳不同,就必須停止寫入,從新校驗。 unix

    在每次更新數據時,都必須執行這一步。否則老歐很生氣!後果很嚴重!
code

    (PS:爲何MySQL裏用來表示時間戳的字段要用datetime來存儲而不用INT來存儲unix時間呢,一個int比datetime更快,另外也不用考慮時區的問題,更方便。明天得問下他才行。)
接口

相關文章
相關標籤/搜索