事務的範圍和鎖範圍

2021-10-24 07:49:18 字數 876 閱讀 5966

@transactional

(rollbackfor = exception.

class

)public

synchronized

void

isertuser4

(user user)

可以看到,因為要考慮併發問題,我在業務層**的方法上加了個 synchronized 關鍵字。我舉個實際

的場景,比如乙個資料庫中,針對某個使用者,只有一條記錄,下乙個插入動作過來,會先判斷該資料庫

中有沒有相同的使用者,如果有就不插入,就更新,沒有才插入,所以理論上,資料庫中永遠就一條同一

使用者資訊,不會出現同一資料庫中插入了兩條相同使用者的資訊。

但是在壓測時,就會出現上面的問題,資料庫中確實有兩條同一使用者的資訊,分析其原因,在於事務的

範圍和鎖的範圍問題。

從上面方法中可以看到,方法上是加了事務的,那麼也就是說,在執行該方法開始時,事務啟動,執行

完了後,事務關閉。但是 synchronized 沒有起作用,其實根本原因是因為事務的範圍比鎖的範圍大。

也就是說,在加鎖的那部分**執行完之後,鎖釋放掉了,但是事務還沒結束,此時另乙個執行緒進來

了,事務沒結束的話,第二個執行緒進來時,資料庫的狀態和第乙個執行緒剛進來是一樣的。即由於mysql

innodb引擎的預設隔離級別是可重複讀(在同乙個事務裡,select的結果是事務開始時時間點的狀

態),執行緒二事務開始的時候,執行緒一還沒提交完成,導致讀取的資料還沒更新。第二個執行緒也做了插

入動作,導致了髒資料。

這個問題可以避免,第一,把事務去掉即可(不推薦);第二,在呼叫該 service 的地方加鎖,保證鎖

的範圍比事務的範圍大即可。

範圍管理和範圍蔓延

1 範圍管理的前提 前提是專案的定義。專案是企業哪個戰略方向下的產物,專案想完成哪些具體目標?只有定義明確了,才有範圍。範圍必須緊密圍繞著定義來開展。範圍不足或範圍蔓延都會對專案產生影響 1 範圍管理包括了兩部分 一部分是實體的產品,比如開發出來的一套軟體 另一部分是專案的商業方案 銷售方案 服務體...

範圍確認和範圍控制

範圍確認 範圍確認是專案干係人正式接受已完成的專案範圍的過程。範圍確認需要審查可交付物和工作成果,貫穿於整個專案。輸入工具與技術 輸出1.範圍說明書 2.wbs字典 3.範圍管理計畫 4.交付物 1.檢查 1.已接受的交付物 2.變更申請 3.推薦的糾正措施 輸入4.交付物。那些已經完成或部分完成的...

範圍管理和範圍蔓延

1 範圍管理的前提 前提是專案的定義。專案是企業哪個戰略方向下的產物,專案想完成哪些具體目標?只有定義明確了,才有範圍。範圍必須緊密圍繞著定義來開展。範圍不足或範圍蔓延都會對專案產生影響 2 範圍管理包括了兩部分 一部分是實體的產品,比如開發出來的一套軟體 另一部分是專案的商業方案 銷售方案 服務體...