看板 Soft_Job 關於我們 聯絡資訊
假設一個訂票系統有一個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 不過這方法效率似乎不好,有更好的方法嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.9.22
a1234shin:B在訂位Update時再檢查一次狀態.... 10/04 15:44
lancer7:問題是在select和update之間還是有可能發生狀態被更改 10/04 15:50
lancer7:maybe有一個user C在你recheck和update之間有作訂位 10/04 15:52
LeafE: 做交易行為 ?? 不過請小心死鍊 !! 10/04 16:01
danielguo:row-level locking? 10/04 16:05
mervynW:UPDAET WHERE 這邊要check啊 10/04 16:12
miisoo4u:先把ORDER都寫到一個TABLE~再寫支排隊程式依序處理 10/04 16:15
miisoo4u:還要再寫支程式監控排隊程式是不是還活著 10/04 16:17
hanbz:參考os書裡面的synchronization那個章節XD 10/04 16:36
phantom400:不想在DB層做lock控管的話 10/04 16:40
phantom400:1.不要使用transation了 Update操作請用單筆操作 10/04 16:41
phantom400:2.Where條件加上是否available 10/04 16:41
atpx:不在transaction處理的話, 在定位成功前檢查一次也是個方法 10/04 21:07
atpx:但是這樣就變成畫面上看有位置點下去沒位置 10/04 21:07
genesic:畫面顯示跟訂下去本來就會不一樣 10/05 14:20
genesic:不然假如畫面一直停在那邊,整個系統就得hold住等你訂完 10/05 14:21
chiaho:insert 訂位資料(包含userID) in temp table 10/08 20:05
chiaho:然後select from temp table top 1, 檢查userId是A還是B 10/08 20:06
chiaho:完整一點的話是 insert 資料+目前時間, select 五分鐘內 10/08 20:10