[討論] 資料需要鎖定並應付多個請求的作法

看板Database (資料庫)作者 (重出江湖)時間8年前 (2016/09/30 00:18), 8年前編輯推噓1(1017)
留言18則, 6人參與, 最新討論串1/1
請問各位 今天interview的時候有跟主管聊到以前的一個問題 就是某個流水號需要一次只能被一個請求讀取 並且使用完要把最新的流水號更新回去 所以必須要用交易鎖定 但主管有提到如果是大量的請求要讀取要怎麼做比較好呢? 這問題之前有跟朋友討論過 結論是用queue 反正就排隊一個一個來 但主管說叫我回去想想是否還有更好的作法 因為我也沒遇過比較極端的情況 所以像這種需要頻繁鎖定資料表避免讀取的話要怎麼做才能效能太差的問題呢? 或是有哪些關鍵字可以尋找呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 119.14.85.193 ※ 文章網址: https://www.ptt.cc/bbs/Database/M.1475165893.A.F08.html

09/30 15:28, , 1F
看不大懂..而雖然小弟不一定能回答 但建議可舉個例
09/30 15:28, 1F

09/30 16:58, , 2F
資料庫是用哪家的呢?
09/30 16:58, 2F
我用的是MS SQL 例如說某個table某列的資料欄位著一個流水號1 當有人去取得它時必須避免有人又讀取這個1 流水號增加到150的時候要update回原來欄位 最後交易結束下一個process才能繼續讀取 也確保他讀到的一定是最新 我使用的作法是用transaction鎖定資料表避免被讀取 當然這種作法在大量process要讀取的時候必定會因為lock而會要等待 process的量越多必定對效能影響也越大 所以不曉得像這種情況在超多process的情況下通常都怎麼解決呢? 謝謝 ※ 編輯: aoksc (119.14.85.193), 09/30/2016 21:26:38

10/01 01:42, , 3F
丟到雲端上面跑吧 不過同步的問題還是無解
10/01 01:42, 3F

10/01 01:43, , 4F
通常會避免大家同時寫入/讀取同一個地方
10/01 01:43, 4F

10/01 01:45, , 5F
只要有"寫入" 就一定要排隊
10/01 01:45, 5F

10/01 01:56, , 6F
其實通常會有工具可以套 只是沒用過不知道OTZ
10/01 01:56, 6F

10/06 01:44, , 7F
'流水號增加到150的時候要update回原來欄位'<=這段看不懂
10/06 01:44, 7F

10/06 01:45, , 8F
我的想法是用程式判斷...
10/06 01:45, 8F

10/07 21:23, , 9F
可以在update 時指定當初取得的序號例如 set seq=150 whe
10/07 21:23, 9F

10/07 21:23, , 10F
re seq=1 取得受影響的筆數就知道有沒有成功,沒成功的話
10/07 21:23, 10F

10/07 21:23, , 11F
就再次取得最新的序號 ,算出差值,下個update 幫原本已
10/07 21:23, 11F

10/07 21:23, , 12F
經寫入的149 筆更新成新的序號,再下個update 更新當前的
10/07 21:23, 12F

10/07 21:23, , 13F
seq 反複這個過程直到成功 簡單說就是 CAS
10/07 21:23, 13F

10/08 12:49, , 14F
如果允許中間有空號就用SEQUENCE 沒做完的就放棄
10/08 12:49, 14F

10/08 12:51, , 15F
如果一定要連號 本質上就是那個號碼會被排斥性保護
10/08 12:51, 15F

10/08 12:52, , 16F
大概就是看能不能拆成分區段的幾個小鎖來分散....
10/08 12:52, 16F

10/08 12:57, , 17F
重點在你的需求是"不重覆"還是"一定要連號"
10/08 12:57, 17F

10/08 12:57, , 18F
不重覆的話好辦 一定要連號就比較麻煩
10/08 12:57, 18F
文章代碼(AID): #1NxJx5y8 (Database)
文章代碼(AID): #1NxJx5y8 (Database)