本文分享自華為雲社區《java進行資料庫操作的併發控制》,作者:張儉。 在現代應用編碼中,從資料庫裡面find出來,進行一些業務邏輯操作,最後再save回去。即: Person person = personRepo.findById(id); person.setAge(18); personRe ...
本文分享自華為雲社區《java進行資料庫操作的併發控制》,作者:張儉。
在現代應用編碼中,從資料庫裡面find出來,進行一些業務邏輯操作,最後再save回去。即:
Person person = personRepo.findById(id); person.setAge(18); personRepo.save(person);
但是這樣的業務操作,如果一個線程修改年齡,另一個線程修改昵稱,最後save回去,可能會導致年齡/昵稱某一個的修改被覆蓋。
常見的解決方案有兩種
執行前添加悲觀鎖
通過分散式鎖等方式,保證同一時間只有一個線程能夠對數據進行修改。
樂觀鎖思路實現
版本控制是另一種流行的處理併發問題的方法。它通過在每次更新記錄時遞增版本號來確保數據的一致性。
這在JPA中,可以通過在field上添加@Version
註解來實現,但這也就要求①資料庫中必須有version欄位,②對於查找後更新類操作,必須使用JPA的save方法來進行更新。
當然也可以通過update_time
來模擬樂觀鎖實現,這可能需要你在更新的時候添加update_time
的條件,並且,update_time
在極端場景下,理論正確性沒那麼嚴謹。