看板 Database 關於我們 聯絡資訊
請問各位 今天interview的時候有跟主管聊到以前的一個問題 就是某個流水號需要一次只能被一個請求讀取 並且使用完要把最新的流水號更新回去 所以必須要用交易鎖定 但主管有提到如果是大量的請求要讀取要怎麼做比較好呢? 這問題之前有跟朋友討論過 結論是用queue 反正就排隊一個一個來 但主管說叫我回去想想是否還有更好的作法 因為我也沒遇過比較極端的情況 所以像這種需要頻繁鎖定資料表避免讀取的話要怎麼做才能效能太差的問題呢? 或是有哪些關鍵字可以尋找呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 119.14.85.193 ※ 文章網址: https://www.ptt.cc/bbs/Database/M.1475165893.A.F08.html
flowwinds: 看不大懂..而雖然小弟不一定能回答 但建議可舉個例 09/30 15:28
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
longlongint: 丟到雲端上面跑吧 不過同步的問題還是無解 10/01 01:42
longlongint: 通常會避免大家同時寫入/讀取同一個地方 10/01 01:43
longlongint: 只要有"寫入" 就一定要排隊 10/01 01:45
longlongint: 其實通常會有工具可以套 只是沒用過不知道OTZ 10/01 01:56
magus: '流水號增加到150的時候要update回原來欄位'<=這段看不懂 10/06 01:44
magus: 我的想法是用程式判斷... 10/06 01:45
AminLA: 可以在update 時指定當初取得的序號例如 set seq=150 whe 10/07 21:23
AminLA: re seq=1 取得受影響的筆數就知道有沒有成功,沒成功的話 10/07 21:23
AminLA: 就再次取得最新的序號 ,算出差值,下個update 幫原本已 10/07 21:23
AminLA: 經寫入的149 筆更新成新的序號,再下個update 更新當前的 10/07 21:23
AminLA: seq 反複這個過程直到成功 簡單說就是 CAS 10/07 21:23
iFEELing: 如果允許中間有空號就用SEQUENCE 沒做完的就放棄 10/08 12:49
iFEELing: 如果一定要連號 本質上就是那個號碼會被排斥性保護 10/08 12:51
iFEELing: 大概就是看能不能拆成分區段的幾個小鎖來分散.... 10/08 12:52
iFEELing: 重點在你的需求是"不重覆"還是"一定要連號" 10/08 12:57
iFEELing: 不重覆的話好辦 一定要連號就比較麻煩 10/08 12:57