→ 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