作者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/cn.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