1. 程式人生 > >spring添加@Transcational的事務調度問題

spring添加@Transcational的事務調度問題

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-tasks 
scheduler="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的事務調度問題