這兩天寫了一個邏輯,需求大概是這樣的, 客戶有硬件下單與小程序下單,此時需要保證下單原子性和庫存一致,
因為是個單體項目,所以簡單處理直接在Service添加synchronized,這樣的話每個設備下單都要等到其他設備下完單
才可以下單,效率很低,后面,在內部維護了一個靜態map,存儲設備序列號,鎖對象為設備序列號,這樣控制每個設備串行下單,
不同設備並行下單.后面想着如果分布式部署,又會出問題,干脆一步到位,直接分布式鎖.lock4j.
介紹完畢.
下面說一下遇到的問題.
Jmeter並發測試,庫存對賬失敗.查閱資料,想起SB,是通過動態代理實現事務的.
下面說明兩種失效的分析
1.添加synchronized在方法上或者代碼塊上
加在方法上,動態代理后直接忽略synchronized,
加在代碼塊上,釋放鎖與動態代理的事務提交先后不一致
2.使用分布式鎖
加在代碼塊上,釋放鎖與動態代理的事務提交先后不一致