天天看點

第 7 章 資料庫并行通路控制

這裡主要講述有關開發中遇到的資料庫并行問題

背景

我們有一個order訂單表,工作流如下

有多個崗位,每個崗位上有多個從業人員。需要實作相同崗位上的從業人員看到的訂單不能重複,防止多人同時操作一個訂單。

正常情況隻要是多人一起打開訂單頁面就會顯示上面的訂單,并且每個人顯示的内容都相同。

<a></a>

表 7.1. 工作流模拟

操作

訂單稽核員 A

訂單稽核員 B

顯示未處理訂單,這裡模拟兩個人同時點開頁面的情景

首先查詢出資料庫中的前五條記錄,然後更新為Pending狀态,防止他人搶占訂單。

select的時候會被行級所挂起,直到被commit後才能查詢出新資料,這是顯示的資料是剩下的後5條

處理訂單,模拟兩個人點選審批通過按鈕是的情景

更新狀态Pending到Processing

處理成功與失敗的情況

處理Pending狀态的訂單,可能産生沖突,不用擔心有行鎖,防止重複處理。

有一種情況,使用者檢視了清單并未及時處理訂單,就會有很多Pending狀态的訂單,這是需要有人處理這些訂單,但查詢Pending時,可能同一時刻有人在審批訂單,我們通過排他鎖避免重複處理。

上面以MySQL為例,每次都需要使用for update 查出要處理的訂單,如果是PostgreSQL 可以使用update + returning 來傳回修改的資料,更為友善。

原文出處:Netkiller 系列 手劄

本文作者:陳景峯

轉載請與作者聯系,同時請務必标明文章原始出處和作者資訊及本聲明。