spring jpa事務注解@Transactional使用注意事項


  在改之前部門定時任務需求時遇見debug查看已經執行了某一段sql,log日志也已經打印sql執行,但是去查看數據庫發現數據庫里的數據並未改變。

但是出於服務器多台部署爭搶執行定時任務的考慮,這個任務開始時數據庫狀態必須改變其他機器便不再執行,后參考資料將Dao.save(entity);改為saveAndFlush()后並未管用。

解決方法:

是因為執行了save()方法,也執行了sql語句,但是因為使用的是

@Transactional

注解,不是手動去提交事務,所以這一條語句已經插入到數據庫了,但是當前不可見。

所以最后可以采用

this.userRepository.saveAndFlush()

方法,讓它及時的flush到數據庫中。

最終解決方案:

  問題出自@Transactional被之前的開發加在了整個類上,只有等當前事務完成后才會改變數據庫,由於當時的業務場景並不會出現問題。現在多台部署要考慮狀態。

將改任務狀態的方法獨立放到另一個類用PROPAGATION_REQUIRES_NEW來解決。

@Transactional(value = Transactional.TxType.REQUIRES_NEW, rollbackOn = Exception.class)
public Boolean updateJobStatus(ScheduleJob scheduleJob,Integer status){}

傳播特性名稱 說明
PROPAGATION_REQUIRED 如果當前沒有事物,則新建一個事物;如果已經存在一個事物,則加入到這個事物中
PROPAGATION_SUPPORTS 支持當前事物,如果當前沒有事物,則以非事物方式執行
PROPAGATION_MANDATORY 使用當前事物,如果當前沒有事物,則拋出異常
PROPAGATION_REQUIRES_NEW 新建事物,如果當前已經存在事物,則掛起當前事物
PROPAGATION_NOT_SUPPORTED 以非事物方式執行,如果當前存在事物,則掛起當前事物
PROPAGATION_NEVER 以非事物方式執行,如果當前存在事物,則拋出異常
PROPAGATION_NESTED 如果當前存在事物,則在嵌套事物內執行;如果當前沒有事物,則與PROPAGATION_REQUIRED傳播特性相同

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM