關於 mysql 的行鎖 for update 的問題,請大神解答?

時間 2021-05-06 23:01:50

1樓:Jeffrey

很簡單,你update set -1 會把庫存減成負數。 所以這裡需要get set操作,由於get set不是原子性操作,所以需要加鎖,來解決事務併發的問題

2樓:

"直接 update set inventory= inventory-1 ,不就根本不需要加行鎖嗎?"這個理解沒問題.

但是查詢->更新整個理解有問題,這裡超發的意思是先查到當前數量,再根據id更新數量,這裡查到的數量不是最新的,所以要加fop update和事務.

"此時程序一是update 操作,有排它鎖鎖行,程序二直接阻塞。"這個做法沒問題,但實際開發中你肯定需要避免不了查詢操作的,比如訂單狀態(是否退單/退款/交易中),貨物屬性(可售/預售/售罄)來做一業務操作而不是單純的update,這就是要解決的問題.即如何確保查詢的是最新的資訊且更新的資訊和查詢是乙個事務.

舉個最簡單的例子,外部傳入單據號,你肯定是先查單據號,確認狀態不是交易中/已結束才回去扣減預算的吧,那麼如何確保同乙個單據號只扣減一次呢,按照上面那個update,如果10ms內傳入兩個單據號一樣的呼叫扣減介面會扣兩次的.

3樓:謝龍

你不覺得,我們需要在

查出 inventory; 然後 $inventory = 9;

之間做很多判斷嗎?最簡單的,我們需要判斷一下inventory是否夠用,因為顯然變更後inventory不能為負。那麼流程就變成了

查出 inventory;

2. 判讀是否可以操作,

3. 然後 $inventory = 9;

如何保證在1和3之間,inventory沒有被更改呢?

4樓:

沒問題,你說的這種方式也是一種樂觀鎖。選擇用樂觀鎖還是悲觀所,需要視具體情況分析。大部分情況用樂觀鎖是沒問題的。

然後,你說的這種形式和加版本號的區別在於,你這種方式介面不冪等,換來了高併發下更高的成功率(只有庫存扣光以後才會失敗,而加版本號併發請求下大概率失敗)。如果外層能處理好冪等的問題,這就是效率最高的一種形式。

5樓:李銘昕

你想法很對,where語句再加個inventory>0就更好了。

但實際場景可能會複雜的多,比如各種判斷,又要再別的表裡判斷啥的。又可能牽扯到別的服務。跨專案啥的。

具體情況還是需要具體分析的。

關於mysql的LOCK疑問?

一 表鎖定方法原理 對WRITE,MySQL使用的表鎖定方法原理如下 如果在表上沒有鎖,在它上面放乙個寫鎖。否則,把鎖定請求放在寫鎖定佇列中。對READ,MySQL使用的鎖定方法原理如下 如果在表上沒有寫鎖定,把乙個讀鎖定放在它上面。否則,把鎖請求放在讀鎖定佇列中。二 WRITE鎖和READ鎖優先順...

MySQL裡如何在指定的行之前插入一行或幾行資料?

藍色麻雀 這個要看你所謂的某行是以那個或哪些欄位來排序的,比如按Watch d來排序 注意,不能是自增欄位 則只要插入行的日期大於指定行的日期即可,然後在輸出採用order by watch d,即可 Idea Bridge 1.就是要取消主鍵 Match R 的自動增加2.更改 Match R 的...

XBOX ONE國行的鎖區,破解週期為多長?以及大概多久會有第二批及後續的遊戲時間表?

so sad 買了xbox one國行,沒幾個遊戲可玩,無冬online 伺服器忒不給力,不是卡就是連不上賬戶伺服器.買了港版ps4,又連不上psn,不是超時就是無盡等待啊有木有.現在只有靠光碟版遊戲過日子 破解鎖區必然是在底層修改系統軟體,我覺得既然都能破鎖區了,刷自製韌體執行盜版遊戲也就不遠了。...