作者aoksc (重出江湖)
看板Database
标题[讨论] 资料需要锁定并应付多个请求的作法
时间Fri Sep 30 00:18:08 2016
请问各位
今天interview的时候有跟主管聊到以前的一个问题
就是某个流水号需要一次只能被一个请求读取
并且使用完要把最新的流水号更新回去
所以必须要用交易锁定
但主管有提到如果是大量的请求要读取要怎麽做比较好呢?
这问题之前有跟朋友讨论过
结论是用queue
反正就排队一个一个来
但主管说叫我回去想想是否还有更好的作法
因为我也没遇过比较极端的情况
所以像这种需要频繁锁定资料表避免读取的话要怎麽做才能效能太差的问题呢?
或是有哪些关键字可以寻找呢?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 119.14.85.193
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1475165893.A.F08.html
1F:→ flowwinds: 看不大懂..而虽然小弟不一定能回答 但建议可举个例 09/30 15:28
2F:推 iamnotfat: 资料库是用哪家的呢? 09/30 16:58
我用的是MS SQL
例如说某个table某列的资料栏位着一个流水号1
当有人去取得它时必须避免有人又读取这个1
流水号增加到150的时候要update回原来栏位
最後交易结束下一个process才能继续读取
也确保他读到的一定是最新
我使用的作法是用transaction锁定资料表避免被读取
当然这种作法在大量process要读取的时候必定会因为lock而会要等待
process的量越多必定对效能影响也越大
所以不晓得像这种情况在超多process的情况下通常都怎麽解决呢?
谢谢
※ 编辑: aoksc (119.14.85.193), 09/30/2016 21:26:38
3F:→ longlongint: 丢到云端上面跑吧 不过同步的问题还是无解 10/01 01:42
4F:→ longlongint: 通常会避免大家同时写入/读取同一个地方 10/01 01:43
5F:→ longlongint: 只要有"写入" 就一定要排队 10/01 01:45
6F:→ longlongint: 其实通常会有工具可以套 只是没用过不知道OTZ 10/01 01:56
7F:→ magus: '流水号增加到150的时候要update回原来栏位'<=这段看不懂 10/06 01:44
8F:→ magus: 我的想法是用程式判断... 10/06 01:45
9F:→ AminLA: 可以在update 时指定当初取得的序号例如 set seq=150 whe 10/07 21:23
10F:→ AminLA: re seq=1 取得受影响的笔数就知道有没有成功,没成功的话 10/07 21:23
11F:→ AminLA: 就再次取得最新的序号 ,算出差值,下个update 帮原本已 10/07 21:23
12F:→ AminLA: 经写入的149 笔更新成新的序号,再下个update 更新当前的 10/07 21:23
13F:→ AminLA: seq 反复这个过程直到成功 简单说就是 CAS 10/07 21:23
14F:→ iFEELing: 如果允许中间有空号就用SEQUENCE 没做完的就放弃 10/08 12:49
15F:→ iFEELing: 如果一定要连号 本质上就是那个号码会被排斥性保护 10/08 12:51
16F:→ iFEELing: 大概就是看能不能拆成分区段的几个小锁来分散.... 10/08 12:52
17F:→ iFEELing: 重点在你的需求是"不重覆"还是"一定要连号" 10/08 12:57
18F:→ iFEELing: 不重覆的话好办 一定要连号就比较麻烦 10/08 12:57