使用forupdate解決併發衝突

2021-10-05 23:04:22 字數 642 閱讀 8738

任務場景:

有乙個主任務表,然後有個子任務表, 乙個主任務對應多個子任務

,當所有子任務完成的時候,需要去更新主任務表為完成狀態。

其中過程為,更新子任務,查詢剩餘子任務數量,如果剩餘子任務數量為0,則更新主任務狀態。

併發問題就是:

如果最後剩兩個使用者,他們提交子任務時後,去查詢剩餘子任務數量,因為開啟了事務沒有提交,所以他們查詢到的數量都是1,然後就都不去update主任務了,這樣最後子任務都完成了,但沒有人來更新主任務了。

解決方案:1.該專案如果是單機,就在該方法上加鎖,syn鎖。

如果是分布式,就加分布式鎖。缺點就是,所有更新子任務狀態時候,都是序列的,影響較大。

2.減少鎖粒度,只鎖最後兩個步驟

因為鎖釋放就是事務提交的時候,下乙個查詢能查到新的值。

3.使用forupdate

使用for update卡住鎖表的解決辦法

今天使用select from bd corp for update改了好幾次之後,突然執行n長時間都不行,馬上給用友打 我聽到了 鎖表 兩個字。們在運算元據庫的時候,有時候會由於操作不當引起資料庫表被鎖定,這麼我們經常不知所措,不知怎麼給這些表解鎖,在pl sql developer工具的的選單 ...

oracle 不能使用for update

select from table name for update 造成oracle資料庫卡死 1 首先查詢出問題表的session id select session id from v locked object l join dba objects o on l.object id o.obj...

使用redis解決併發操作問題

在日常的開發中,有時我們會遇到這樣的場景 多個人對同乙個資料進行修改操作,導致併發問題發生。這個問題可以通過悲觀鎖來解決,但是悲觀鎖也是有限制的,在某些場景中是不適應的,因為和資料的耦合度太高了,可能會影響到其他業務的操作。而使用redis來解決這一問題是很好的選擇。redis的儲存指令中有乙個se...