在改之前部門定時任務需求時遇見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傳播特性相同 |