亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果有個業務場景:該怎么處理?

如果有個業務場景:該怎么處理?

幕布斯6054654 2022-10-26 21:19:16
比如有張庫存表 inv,有個字段物料 material,有個字段數量 qty,當然還有ID。每次入庫,先查找庫存是否有這個物料,如果有的話,則數量需要加上去,如果不存在,需要生成一條這樣的記錄,包含物料以及數量。我只是打個比方,這個在一般系統里面都會初始化的,沒個物料都有一條默認的數量為0的記錄,我就不說了。如果不能初始化,我需要動態的添加,則情況如下,比如 M1物料入庫10公斤如果存在 就數量加 不存在就新加一行if(inv exists 'M1') {  update inv set qty=qty+10 where material='M1'}else{  insert inv (material,qty) values ('M1',10)}如果并發的話,比如 人員A、B同時做入庫單A 執行 查看 exists 時間為t1B 執行 查看 exists 時間為t2A 執行 查看 insert 時間為t3B 執行 查看 insert 時間為t4t1<t2<t3<t4,如果剛好遇到這樣的情況,大家查的時候都不存在,每個人都入了,怎么辦,處理這種情況,這樣導致物料M1存在2條數據,當然 可以對物料進行唯一索引,但是這樣B插入就會報錯,請問大家有什么辦法讓這種情況不發生,不能唯一索引,也不能lock table,謝謝
查看完整描述

2 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

1:必須采用事務,否則會出現丟失更新的情況。
2:在并發情況下,如何設計這個事務。
  2.1:數據庫有默認的鎖機制,就像我們執行一條簡單的“update table set .... where ...”,數據庫會瞬間加排他鎖,其它所有的操作等待。
  2.2:數據庫加鎖時間取決于數據庫的設計以及程序處理事務的方法,盡可能的減少事務執行時間。

3:解決辦法
  3.1:開始事務,讀加排他鎖
  3.2:判斷并執行插入或更新操作
  3.3:提交事務

查看完整回答
反對 回復 2022-11-01
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

if(inv exists 'M1') {
  update inv set qty=qty+10 where material='M1'
}else{
  insert inv (material,qty) values ('M1',10)
}
把這個放到一個事務里面就好了,t1,t3,執行完后才會執行t2,t4,

查看完整回答
反對 回復 2022-11-01
  • 2 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號