Re: [請益] 這是個很低級的錯誤嗎?

看板Soft_Job作者 (Panel)時間5年前 (2019/05/08 01:28), 編輯推噓9(909)
留言18則, 14人參與, 5年前最新討論串3/4 (看更多)
※ 引述《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 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1557250084.A.086.html

05/08 02:03, 5年前 , 1F
我會推薦用 function ROW_NUMBER()
05/08 02:03, 1F

05/08 08:28, 5年前 , 2F
05/08 08:28, 2F

05/08 08:57, 5年前 , 3F
觸發器
05/08 08:57, 3F

05/08 09:57, 5年前 , 4F
或是 transaction + for update
05/08 09:57, 4F

05/08 10:06, 5年前 , 5F
我覺得這種討論 可以有
05/08 10:06, 5F

05/08 10:06, 5年前 , 6F
必須有
05/08 10:06, 6F

05/08 10:07, 5年前 , 7F
之前有個前輩使用適用insert某張表 然後取得insert id
05/08 10:07, 7F

05/08 10:07, 5年前 , 8F
當作流水序號 不知道這樣做法如何
05/08 10:07, 8F

05/08 10:23, 5年前 , 9F
sqlserver有內建的方法,欄位可以設定識別key
05/08 10:23, 9F

05/08 10:24, 5年前 , 10F
想要手動控制,是有很多方式,只是要規範清楚
05/08 10:24, 10F

05/08 18:39, 5年前 , 11F
以稽核角度來看 設auto increment還發生跳號
05/08 18:39, 11F

05/08 18:40, 5年前 , 12F
代表有人動過資料表
05/08 18:40, 12F

05/08 21:33, 5年前 , 13F
transaction失敗也會跳號吧
05/08 21:33, 13F

05/08 21:50, 5年前 , 14F

05/08 22:50, 5年前 , 15F
優質討論
05/08 22:50, 15F

05/09 09:56, 5年前 , 16F
SQL 取號又不保證插入成功 正常情況也會跳號
05/09 09:56, 16F

05/10 20:56, 5年前 , 17F
推推
05/10 20:56, 17F

05/15 04:23, 5年前 , 18F
之前我也是用插入取得key
05/15 04:23, 18F
文章代碼(AID): #1SqS0a26 (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1SqS0a26 (Soft_Job)