spring添加@Transcational的事務調度問題
阿新 • • 發佈:2018-09-29
ring div 繼續 service cat 事務 scheduled 調度 問題
報錯信息:org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 服務器無法繼續執行該事務。說明: 8900000003。
xml代碼如下:
<task:scheduler id="scheduler" pool-size="5"/> <task:scheduled-tasksscheduler="scheduler"> <!--BOM庫齡每間隔1分鐘執行--> <task:scheduled ref="amsJob" method="eglInventoryAgingBom" fixed-delay="10000"/> <!--RFID庫齡每間隔1分鐘執行--> <task:scheduled ref="amsJob" method="eglInventoryAgingRfid" fixed-delay="10000"/> <!-- 日庫存,每隔一天執行--> <task:scheduled ref="amsJob" method="dailyItrn" cron="0 0 1 * * ?"/> </task:scheduled-tasks>
amsJob.java文件代碼如下:
@Service public class AmsJob { @Resource private InventoryBomAgingMapper inventoryBomAgingMapper; @Resource private InventoryRfidAgingMapper inventoryRfidAgingMapper;//當在此處添加事務時報錯 @Transactional public void eglInventoryAgingBom() { inventoryBomAgingMapper.eglInventoryAgingBom(); } @Transactional public void eglInventoryAgingRfid() { inventoryRfidAgingMapper.eglInventoryAgingRfid(); } }
報錯原因:不能為這個事務打開JDBC連接,任務調度每10秒鐘執行一次,當執行第一次時,拿到第一次連接,給這個連接加上了Transcational,當第二次再去連接池取時,可能會拿到同一個連接,並且還帶上了第一次的Transcational,但是第二次本身有自己的Transcational,因此報錯.
解決方案:采取折中的辦法,新建一個Service類,在service類中添加事務,amsJob去調用service中的方法.
解決方案代碼如下:
amsJob.java文件代碼做如下修改:
@Service public class AmsJob { // 在此處註入一個Service,在這個Service裏添加事務 @Resource private JobService jobService; //在此處把事務給去掉 public void eglInventoryAgingBom() { jobService.eglInventoryAgingBom(); } public void eglInventoryAgingRfid() { jobService.eglInventoryAgingRfid(); } }
新增JobService類:
@Service public class JobService { @Resource private InventoryBomAgingMapper inventoryBomAgingMapper; @Resource private InventoryRfidAgingMapper inventoryRfidAgingMapper; //事務在此處開啟 @Transactional public void eglInventoryAgingBom() { inventoryBomAgingMapper.eglInventoryAgingBom(); } @Transactional public void eglInventoryAgingRfid() { inventoryRfidAgingMapper.eglInventoryAgingRfid(); } }
如此一來,大功告成,皆大歡喜.
spring添加@Transcational的事務調度問題