Readers & Writers Problem

昨天晚上九點就不支睡去,到了凌晨三點就昏昏醒來;於是拿起Operating Systems開始念,念啊念的就念到"Readers and Writers Problem"。這玩意本來是OS裡滿基本也滿經典的問題,可是寫高鐵售票系統的那群笨蛋工程師卻怎麼也搞不清楚的樣子;搞到現在還有重複訂票的問題,這算是軟體工程界的一大笑話。

簡單說來,Readers and Writers Problem講的就是這麼回事:當writer寫入前,會在資料上取得一個lock,這個lock防止其他的reader/writer重複取得這個資料的lock,當寫入完成以後,再把lock釋放回去。而當reader讀取資料時,會先將這個資料放一個write lock(可以重複read),然後等所有的資料都讀完以後再把這個lock釋放出來。我猜想高鐵的問題就出在這裡;當使用者還沒訂位時,系統把查詢訂位以reader處理,而當訂位這個動作實際執行時,並沒有進一步執行write lock(或者執行了可是順序不對),所以重複訂位(重複寫入)就不斷產生了。

這個問題讓我想到之前修Advanced Database Systems時學過的2-Phase Locking。我不打算深究2-Phase Locking/Strict 2-Phase Locking的細節,總之這玩意應該是concurrent transactions的基本;這群高鐵工程師(或者系統設計者)實在應該打屁股,這麼基礎的東西也會寫成這個樣子。