作者amnesia (記不住)
看板Soft_Job
標題[請益] 類似critical section的DB query
時間Thu Nov 12 21:12:31 2015
不好意思,這個應該有個專有名詞,但我實在不知道
只是覺得概念很像critial section @@
假設我DB裏面長得像這樣
id | price | name | dirty
01 100 abc123 N
02 100 def999 N
03 100 xxx877 N
......
100
那我設計一個API,要提供price=100裏面的任何1個id給user
在這個例子,假設這100個裏面有50個price是100好了
那就是從這50個裏面挑一個給user
重點是如同時有20個人要的話
我不能把同樣的id給不同的人
當我把id給出去後,我需要把這個record設成dirty
想請問這個要怎麼做比較好?
目前DB跟language都還沒決定
看用什麼來做比較適合就用哪個
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.75.65
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1447333953.A.22C.html
1F:推 atpx: 開個註記欄位紀錄已給出去,用什麼db都沒差吧 11/12 21:14
2F:→ atpx: 有錢就買oracle 11/12 21:14
3F:推 atpx: 沒看清楚,原來有開欄位了,你卡住的地方是? 11/12 21:40
4F:→ amnesia: 如果同時有人query還沒mark起來不就會一起出去了? 11/12 21:40
5F:推 fgh81113: 你可以設Synchronization的方法 11/12 21:48
6F:→ jimmy689: transation <== 11/12 21:49
7F:→ jimmy689: 設exclusive lock、semaphore之類的 11/12 21:52
8F:→ jimmy689: rails的話record好像有現成的能用 11/12 21:53
fgh大,謝謝啦,Synchronization 對啦,我本來是要講這個
不過jimmy大也提了很多方法,像transaction跟semaphore我還有聽過
但是我忽然發現不知道怎麼把這些方法套到我的情況耶
是要把db connection這類的東西用Synchronization嗎?
不是很懂要怎麼實際應用到我的case,不知道有沒有參考範例 ^^;
※ 編輯: amnesia (220.132.75.65), 11/12/2015 21:59:23
9F:→ Masakiad: 聽起來像抽獎 11/12 22:03
10F:→ amnesia: 有點類似 11/12 22:04
11F:推 atpx: 只是取號就查詢的時候拉高 isolation level 11/12 22:14
12F:推 abccbaandy: 聽起來跟之前把票重複賣的情況好像XD 11/12 22:19
13F:→ sanfann: select for update? 11/12 23:04
14F:→ amnesia: 對耶,我沒想到跟賣票的應用很像耶 11/12 23:07
15F:→ amnesia: select for update會把整個table lock? 11/12 23:16
16F:→ amnesia: 有沒有方法是不要把整個table lock的? 11/12 23:17
17F:→ amnesia: 不然我覺得要切farm做hash,免得單一table鎖太久 11/12 23:18
18F:→ amnesia: select for update應該是最簡便的解法嗎? 11/12 23:34
19F:→ amnesia: 大概loading到什麼情況會讓人有感到慢? 11/12 23:35
20F:推 locklose: select for update 屬於row-lock,效能不會太差. 11/13 00:22
21F:→ locklose: 但這東西建議寫好stored procedure 減少db組譯時間 11/13 00:23
22F:推 hahahank: 程式中控制也可以吧 11/13 13:28
23F:推 arenda: 用Queue處理? 11/13 23:06
24F:→ Masakiad: 我也覺得queue應該有機會 11/13 23:17
25F:→ amnesia: 用queue會只能處理一個request嗎?能在多說明一下嗎 11/15 18:24
26F:推 Masakiad: 把所有request enqueue,然後worker批次把request deque 11/15 21:15
27F:→ Masakiad: ue並進行db read write,之後才response。你可以用數個q 11/15 21:15
28F:→ Masakiad: ueue來進行以上操作 11/15 21:15