看板 Soft_Job 關於我們 聯絡資訊
※ 引述《lancer7 (158)》之銘言: : 假設一個訂票系統有一個table:座位 : 欄位有日期、座位號碼、是否available、訂位人的ID : 現在有兩個user: A, B進入了訂票系統 : 接著發生了以下事件 : 1. A select此table發現有五個空位 : 2. B select此table發現有五個空位 : 3. A 訂了四個位子,並且把這四個位子的狀態update為unavailable : 4. A結束transaction : 5. 現在B以為有五個空位,於是訂了兩個位子 => 發生重複訂位的問題 : 請問一下,有什麼辦法解決這個同步的問題? : 我想到的方法是在事件1發生時讓A對table作lock,然後B要等到A結束transaction才能select : 不過這方法效率似乎不好,有更好的方法嗎? 老實說這要處理的不應該是技術上的問題,而是規劃上的問題, 如果只以程式來說, lock 層越往外,lock 的時間越長,空位的浮動率會越大, lock 層越往內,lock 的時間越短,使用者會越晚被攔阻(較高的達成期望) 兩個方向上都各有利弊, 所以重點是要怎麼規劃這個訂購的流程,要在哪個步驟設下斷點, 當使用者在哪個步驟失敗(拿不到座位)時要怎麼說明 / 安撫。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.45.240.59 ※ 編輯: gpmm 來自: 114.45.240.59 (10/06 00:23)
Ting1024:正確 10/06 02:04
pingsky:另外一個想法是搭配分散式處理, 把不同區段拆到另一台機器 10/06 09:13
pingsky:這樣在效率上受到的限制或許能較小一點 10/06 09:15
vyjssm:update之前,不能先read with lock?這樣別人read不到。 10/06 18:35
vyjssm:真要update,先check是否被別人訂走,也不能update。 10/06 18:36