[請益] 資料庫同步的問題

看板Soft_Job作者 (158)時間12年前 (2011/10/04 15:41), 編輯推噓6(6013)
留言19則, 11人參與, 最新討論串1/3 (看更多)
假設一個訂票系統有一個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

10/04 15:44, , 1F
B在訂位Update時再檢查一次狀態....
10/04 15:44, 1F

10/04 15:50, , 2F
問題是在select和update之間還是有可能發生狀態被更改
10/04 15:50, 2F

10/04 15:52, , 3F
maybe有一個user C在你recheck和update之間有作訂位
10/04 15:52, 3F

10/04 16:01, , 4F
做交易行為 ?? 不過請小心死鍊 !!
10/04 16:01, 4F

10/04 16:05, , 5F
row-level locking?
10/04 16:05, 5F

10/04 16:12, , 6F
UPDAET WHERE 這邊要check啊
10/04 16:12, 6F

10/04 16:15, , 7F
先把ORDER都寫到一個TABLE~再寫支排隊程式依序處理
10/04 16:15, 7F

10/04 16:17, , 8F
還要再寫支程式監控排隊程式是不是還活著
10/04 16:17, 8F

10/04 16:36, , 9F
參考os書裡面的synchronization那個章節XD
10/04 16:36, 9F

10/04 16:40, , 10F
不想在DB層做lock控管的話
10/04 16:40, 10F

10/04 16:41, , 11F
1.不要使用transation了 Update操作請用單筆操作
10/04 16:41, 11F

10/04 16:41, , 12F
2.Where條件加上是否available
10/04 16:41, 12F

10/04 21:07, , 13F
不在transaction處理的話, 在定位成功前檢查一次也是個方法
10/04 21:07, 13F

10/04 21:07, , 14F
但是這樣就變成畫面上看有位置點下去沒位置
10/04 21:07, 14F

10/05 14:20, , 15F
畫面顯示跟訂下去本來就會不一樣
10/05 14:20, 15F

10/05 14:21, , 16F
不然假如畫面一直停在那邊,整個系統就得hold住等你訂完
10/05 14:21, 16F

10/08 20:05, , 17F
insert 訂位資料(包含userID) in temp table
10/08 20:05, 17F

10/08 20:06, , 18F
然後select from temp table top 1, 檢查userId是A還是B
10/08 20:06, 18F

10/08 20:10, , 19F
完整一點的話是 insert 資料+目前時間, select 五分鐘內
10/08 20:10, 19F
文章代碼(AID): #1EYhZ7yQ (Soft_Job)
文章代碼(AID): #1EYhZ7yQ (Soft_Job)