在今天做的項目練習部分中真的學到了很多東西,也補充了許多之前遺漏或是忘記的知識點,但時間精力有限,我就先記錄一下今天用到的一個新東西,悲觀鎖和樂觀鎖。
首先給出實際應用背景:
在加入鎖和事務注解之前,這里有著很明顯的并發問題,如果沒有紅圈中的部分,會出現以下情況
沒有鎖導致:
①多個用戶快速點擊,僅剩1張優惠券,卻多個用戶都搶到了優惠券(即user_coupon中新增了多條記錄)!!!
沒有事務導致:
①假設在if(i==0)代碼塊中拋出了異常,但由于沒有加入事務注解,因此無法回退,導致了“更新coupon表中的相關數據”這一步造成的影響無法恢復!!!
而加入了悲觀鎖和事務注解以后就很好的解決了這些并發問題!
=========================================================================
其次這里的使用還有許多細節,eg:
①鎖對象用到的是user.toString().intern() 而不是 user.toString()
? ?(這一點牽扯到了spring的動態代理,我會在明天的博客中解釋并把鏈接粘過來)
②鎖和事務的順序:上鎖——>事務開啟——>事務上交——>開鎖
? ?(這一點屬于事務邊界和鎖邊界問題,同樣的,明天補充)
接下來是我用到的一個樂觀鎖(嚴格來講它屬于數據庫層面的樂觀鎖機制):
從圖中的紅圈部分可以看出,它為了避免這一種高并發情況:
①假設有2個用戶都通過了之前的層層校驗來到了這里,但實際上這里只能再新增1條數據,如果沒有紅圈中的條件,就會導致增加了2條數據(即issue_num>=total_num),而這并不符合業務邏輯
有了紅圈中的類似于樂觀鎖思想的條件,再進行一次對數據的判斷,可以有效解決并發問題!