現在的場景大概是:查一條記錄,沒有就插入,有就 update。
倉庫有一張報表。欄位有 (id 倉庫 日期 簽出數 簽入數 廢棄數 .....) 等等。
倉庫 、 日期 是唯一關聯的,每天只能出現一條記錄。
生成一條記錄,然后其他的簽出 、 簽入 、廢棄等操作,在欄位 + 1,
但是每日簽出、簽入、廢棄等等操作有很多,甚至是其他介面不停推送的。
可能同一秒都有很多個走這條資料。
例如 : 倉庫一 2020-04-20 1080 2267 1117
此時有簽出、簽入、廢棄等操作。
三個事務都走到這一句 : SELECT * FROM table WHERE date='2020-04-20' and 倉庫='倉庫一';
都是查到沒有資料,各插入一條,此時就會在 同一天、同一個倉庫有 3 條資料。
目前我想到的解決方案是:給 (倉庫 | 日期)加唯一索引,事務二、三 走到此處插入,然后插入失敗。
但是假如一個簽出要走很長的事務,,最后就因為一個統計失敗,導致簽出失敗,不是特別合理。
有什么更好的解決方案嗎? 求大神解答
uj5u.com熱心網友回復:
對一條資料發生事務,要先從實際業務背景出發。多問幾個為什么?比如:為什么簽出、簽入、廢棄? 進和出,是資料事務的進倉、出倉的動作,這沒什么可疑問的。
但廢棄是什么意思,物料報廢處理?
那就有兩個前提,前提1:存在庫存時,才會產生廢棄。
前提2:在發生對某個物料進行【簽入】或【簽出】時,是否允許發生【廢棄】。
你的邏輯挺混亂的。
uj5u.com熱心網友回復:
不好意思可能是我我沒表達清楚。
其實就是一張倉庫日報表,今日簽出了多少,進了多少,廢棄了多少。。。并不是針對的某一個SKU。
除了日期、倉庫,其他的欄位都是 int 型,初始欄位都是 0 ,就是比如有簽出 就在此欄位 +1,有進入 也 +1,有其他等等操作也是 +1。
比如今天出現了一條資料
id date warehouse num1 num2 num3
1 2020-04-18 倉庫一 10 15 0
1 2020-04-19 倉庫一 10 15 0
1 2020-04-20 倉庫一 10 15 0
類似于這種的 倉庫日報表,就是 (日期 | 倉庫)作為一個維度保證唯一,其他欄位都是 update 進去的 ..
uj5u.com熱心網友回復:
目前我想到的另一個解決方案就是,今日日期是 2020-04-20 ,那我在今日就插入一條明日的日期 2020-04-21 | 倉庫1 的記錄,其他欄位默認為0....可是初始的今天資料,還是會出現并發呀..........
uj5u.com熱心網友回復:
我還是沒看懂你最終的需求是什么。一會說,只改變這三個數,都是update發生的。
一會又說,這三個數,在每天(日期)都會發生一條記錄。
既然你是這樣設計,那如果業務發生時,同時多筆存在簽入或簽出時,也就是說對num1或num2同時發生多次update,那肯定打架。
這樣設計能不打架?
uj5u.com熱心網友回復:
最終需求其實就是一個簡單的倉庫日報表。
比如2020-04-20 這一天,倉庫 今天 簽出了多少,簽入了多少,某某操作有多少個了多少。
然后再簽入、簽出,或者其他操作的介面里加上一段代碼,
每次對該欄位進行 +1,update 表 set num1 = num1 +1 where 倉庫='倉庫一' and date='2020-04-20';
其實就是判斷當天的 日期+倉庫的 作為唯一的這條日報資料有沒有存在,有就插入一條今日的,并對相應的操作進行+1,沒有就 update 其他欄位.
uj5u.com熱心網友回復:
把實際的業務資料放上來,同時把要的結果集圖樣,畫一個出來。這樣才知道怎么實作。
概念基本上已經明白
uj5u.com熱心網友回復:
想到了一個最簡單的解決方案:在 create 這張表的時候,先用 SQL 語句插入一條 發布版本日的日期,比如
1 倉庫一 2020-04-20 0 0 0
然后每日執行一次(可以用自動任務),插入一條第二天的 日期記錄
比如 今日日期 為 2020-04-20 ,我在今日就插入一條明日(2020-04-21)的記錄:
10 倉庫一 2020-04-21 0 0 0
那么到了明天(即 2020-04-20這一天),有簽出操作的時候,先檢測 :
select * from table where warehouse='倉庫一' and date = '2020-04-21'
其實這條資料在前一天就已經建好了。
即便是多個事務,檢測到也是有這條資料
那么 直接 update 其他欄位就好了
uj5u.com熱心網友回復:
嗯,其實就是一個并發導致:
比如三個事務都在:
select * from table where warehouse='倉庫一' and date = '2020-04-20' 這一個記錄結果。
結果三個事務都查出結果為 0 ,
于是各 插入一條:
id date warehouse num1 num2 num3
1 2020-04-20 倉庫一 0 0 0
1 2020-04-20 倉庫一 0 0 0
1 2020-04-20 倉庫一 0 0 0
最后就會導致,日期都是同一天,生成了 3條記錄,實際每日只需要一條記錄。
另外你看下我最后寫的那個解決方案怎么樣,哈哈哈
uj5u.com熱心網友回復:
我沒空和你在這討論來討論去,你覺得可行,就自己搞吧。沒實際的資料,我幫不了你。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/39759.html
標籤:疑難問題
下一篇:資料庫——資料庫附加出錯
