作多用戶操做的系統,必定,必定,必定要考慮「併發」

作多用戶操做的系統,必定,必定,必定要考慮「併發」,這種併發,除了系統級別的併發,還有應用級別的併發。若是兩我的同時去操做相同的數據,那麼要有「第二我的就操做不了」的機制!sql

請你們考慮一套未來再遇到這種問題的解決方案.併發

這裏我針對 若是兩我的同時去操做相同的數據,那麼要有「第二我的就操做不了」的機制!提出一種解決方法:
spa

有一個比較好的辦法能夠解決這個問題,那就是經過一個單獨的能夠順序遞增的version字段。改成如下方式便可:code

//查詢出商品信息,version = 1
select version from items where id=1
//修改商品庫存爲2 update items set quantity=2,version = version+1 where id=1 and version = 1;

每次在執行數據的修改操做時,都會帶上一個版本號,一旦版本號和數據的版本號一致就能夠執行修改操做並對版本號執行+1操做,不然就執行失敗。由於每次操做的版本號都會隨之增長,因此同時修改的話只有一個修改生效。blog

 

除了version之外,還可使用時間戳,由於時間戳自然具備順序遞增性:it

  • 首先表裏面要增長的一個記錄時間戳的字段;
  • 每次更新數據的時候都要更新這個字段的值爲最新的時間戳;
  • 而且更新的sql語句裏面的where條件必需要有這個字段;

例子:io

UPDATE_AT是時間戳字段,請看以下兩條相同的update語句:class

update "AREACODE" set "UPDATE_AT"=now() where "GCODE"='510303' AND "UPDATE_AT"='2019-06-19 17:02:42.755857'; update "AREACODE" set "UPDATE_AT"=now() where "GCODE"='510303' AND "UPDATE_AT"='2019-06-19 17:02:42.755857';

執行結果以下:date

 

結果第一條sql語句執行了,第二條沒有執行成功,實現了若是 兩我的同時去操做相同的數據,那麼要有「第二我的就操做不了」select

相關文章
相關標籤/搜索