這裡主要講述有關開發中遇到的資料庫并行問題
背景
我們有一個order訂單表,工作流如下
有多個崗位,每個崗位上有多個從業人員。需要實作相同崗位上的從業人員看到的訂單不能重複,防止多人同時操作一個訂單。
正常情況隻要是多人一起打開訂單頁面就會顯示上面的訂單,并且每個人顯示的内容都相同。
<a></a>
表 7.1. 工作流模拟
操作
訂單稽核員 A
訂單稽核員 B
顯示未處理訂單,這裡模拟兩個人同時點開頁面的情景
首先查詢出資料庫中的前五條記錄,然後更新為Pending狀态,防止他人搶占訂單。
select的時候會被行級所挂起,直到被commit後才能查詢出新資料,這是顯示的資料是剩下的後5條
處理訂單,模拟兩個人點選審批通過按鈕是的情景
更新狀态Pending到Processing
處理成功與失敗的情況
處理Pending狀态的訂單,可能産生沖突,不用擔心有行鎖,防止重複處理。
有一種情況,使用者檢視了清單并未及時處理訂單,就會有很多Pending狀态的訂單,這是需要有人處理這些訂單,但查詢Pending時,可能同一時刻有人在審批訂單,我們通過排他鎖避免重複處理。
上面以MySQL為例,每次都需要使用for update 查出要處理的訂單,如果是PostgreSQL 可以使用update + returning 來傳回修改的資料,更為友善。
原文出處:Netkiller 系列 手劄
本文作者:陳景峯
轉載請與作者聯系,同時請務必标明文章原始出處和作者資訊及本聲明。