顯示廣告
隱藏 ✕
※ 本文為 terievv 轉寄自 ptt.cc 更新時間: 2019-05-11 20:56:14
看板 Soft_Job
作者 Label (Panel)
標題 Re: [請益] 這是個很低級的錯誤嗎?
時間 Wed May  8 01:28:01 2019


※ 引述《a88241050 (再回頭已是百殘身)》之銘言:
: 是這樣的
: 最近工作上需要寫一支程式寫資料進資料庫
: 並產生流水號當key值寫進欄位中
: 我的想法很單純
: 就是直接抓資料庫資料筆數
: 然後拿筆數+1當新增的流水號
: 寫完後交給SA測試
: 結果他一測馬上就出問題了
: 後來我才知道 原來流水號是要抓最大值+1
: 而不是一直照順序編下去
: 因為這個我被SA噹的體無完膚
: 請問這個是很基本的觀念嗎?

  auto increment 遇到以下情境會有跳號等問題
  1. 同table多種序號應用
  2. 不預期的增刪
  3. 定期重置,例如每個月要重新由1開始滾動

  有一種方式是將流水號另存一專存序號的table
  由專門的取號程式來存取

  例如
  -- 取得目前 序號
  Select order_seq from seq_numbers;

  -- 例如目前為102
  -- 嘗試更新序號 若更新筆數 = 1 則呼叫結果回傳為真
  -- effected rows為0 便是被其他process先取號,需重試
  update seq_numbers set order_seq = order_seq + 1
  where order_seq = 102;

  缺點是存取db的頻繁,增加伺服器端的負擔
  因此也有把流水號存在 NOSql 如redis mongodb 等載體
  以push pop來配發或者讓各process來領取






--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.150.145.60
※ 文章代碼(AID): #1SqS0a26 (Soft_Job)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1557250084.A.086.html
ashlikewing: 我會推薦用 function ROW_NUMBER()1F 05/08 02:03
cuttleufish: 推2F 05/08 08:28
xdraculax: 觸發器3F 05/08 08:57
sextitanic: 或是 transaction + for update4F 05/08 09:57
MOONY135: 我覺得這種討論 可以有5F 05/08 10:06
MOONY135: 必須有
bill0205: 之前有個前輩使用適用insert某張表 然後取得insert id7F 05/08 10:07
bill0205: 當作流水序號 不知道這樣做法如何
MephistoH: sqlserver有內建的方法,欄位可以設定識別key9F 05/08 10:23
MephistoH: 想要手動控制,是有很多方式,只是要規範清楚
ChungLi5566: 以稽核角度來看 設auto increment還發生跳號11F 05/08 18:39
ChungLi5566: 代表有人動過資料表
jack0204: transaction失敗也會跳號吧13F 05/08 21:33
aszx4510: 優質討論15F 05/08 22:50
MangoTW: SQL 取號又不保證插入成功 正常情況也會跳號16F 05/09 09:56
pttrAin: 推推17F 05/10 20:56

--
※ 看板: terievv 文章推薦值: 0 目前人氣: 0 累積人氣: 180 
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇