看板 Database 關於我們 聯絡資訊
如果是我的話可能會這樣做. 資料庫 transaction 的時間越短越好, 不會放入和使用者互動的部分 ※ 引述《lancer7 (158)》之銘言: : 假設一個訂票系統有一個table:座位 : 欄位有日期、座位號碼、是否available、訂位人的ID : 現在有兩個user: A, B進入了訂票系統 : 接著發生了以下事件 : 1. A select此table發現有五個空位 : 2. B select此table發現有五個空位 3. A 點選了四個位置, 並點下一步或確定 4. begin; lock 位子 table 此場次的 row; 檢查四個位置=>無人; 更新四個位置狀態為已定位; commit; 5. B 點選了兩個位置, 並點下一步或確定 6. begin; lock 位子 table 此場次的 row; 檢查兩個位置=>有人; 中止 transaction; 7. 和 B 說此位置已有人選取 : 3. A 訂了四個位子,並且把這四個位子的狀態update為unavailable : 4. A結束transaction : 5. 現在B以為有五個空位,於是訂了兩個位子 => 發生重複訂位的問題 : 請問一下,有什麼辦法解決這個同步的問題? : 我想到的方法是在事件1發生時讓A對table作lock,然後B要等到A結束transaction : 才能select : 不過這方法效率似乎不好,有更好的方法嗎? 一定不能這樣做, 不然系統會變成同時間單人限定 基本上在還沒選位時 lock 行不通. 例如 A 進入畫面看到 500 個位置, 而他只需要一個 系統無法預測他想要哪個, 也不可能把全部 500 個都先 lock 起來 (變成單人系統) 如果要減少選位被人家訂走的情形, 可以定時重新查詢資料庫來更新畫面 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 24.19.233.135 ※ 編輯: danielguo 來自: 24.19.233.135 (10/05 14:59)
iamnotfat:感謝分享 受教了 10/06 18:42