1. 程式人生 > >spring 宣告式事務傳播特性詳解(包括異常回滾舉例)

spring 宣告式事務傳播特性詳解(包括異常回滾舉例)

1:Service介面實現

public interface IProcessBusiService {
      //事務1
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void submit(ProcessResult result) throws Exception;
2、public interface IBatchMigrationHistoryTaskService {


//事務2
@Transactional(readOnly=false,propagation = Propagation.REQUIRES_NEW)
public void updateBatStatus(EcdsBatchRunning batch) throws Exception;
//事務3
@Transactional(readOnly=false,propagation = Propagation.REQUIRED)
public void updateSyspara(SysParameter para) throws Exception;
//事務4
@Transactional(readOnly=false,propagation = Propagation.REQUIRED)
public void updateSysparaBank(SysParaBank para) throws Exception;




}


3:Impl實現類
@Service("ProcessQueryTimeTaskService")
public class ProcessQueryTimeTaskServiceImpl implements IProcessBusiService {


@Override
public void submit(ProcessResult result) throws Exception {
  runLoaningToFund(result);
}


public void runLoaningToFund(ProcessResult result1){
logger.info("***********  墊資未處理自動轉為普通融資重處理開始 ***********");




EcdsBatchRunning batchRunning = null;
try {
 //第一個
batchRunning=(EcdsBatchRunning) commonQueryService.select(EcdsBatchRunning.class, BatchTypeStatus.BAT_18);
batchRunning.setRmrk("890");
batchMigrationHistoryTaskService.updateBatStatus(batchRunning);
//第二個
SysParameter para =(SysParameter) commonQueryService.select(SysParameter.class,18l );
para.setParaValue("119");
batchMigrationHistoryTaskService.updateSyspara(para);


//第三個
SysParaBank parabank =(SysParaBank) commonQueryService.select(SysParaBank.class,137l );
para.setParaValue("20");
batchMigrationHistoryTaskService.updateSysparaBank(parabank);


}catch (Exception e) {
e.printStackTrace();
}
}

總結:1:如果沒有新增@Transactional事務說明,sql語句不會執行

2:如果只有事務1的時候,執行到第三個的時假如報異常,會回滾之前兩個

               3:假如只有事務1的時候,在第二個和第三個之間出現int a = 10/0這種異常,那麼第一個和第二個不會進行回滾操作。

4:存在事務1、2、3和4四個事務時,執行到第三個的時候,第一個不會回滾,第二個會回滾。


如果只有事務1的時候,執行到第三個的時假如報異常,會回滾之前兩個

3:、下面圖片是Spring 實戰(第3版)給出的事務傳播特性的截圖


      @Transactional(readOnly=false,propagation = Propagation.REQUIRES_NEW)
public void updateBatStatus(EcdsBatchRunning batch) throws Exception;

@Transactional(readOnly=false,propagation = Propagation.REQUIRED)
public void updateSyspara(SysParameter para) throws Exception;

@Transactional(readOnly=false,propagation = Propagation.REQUIRED)
public void updateSysparaBank(SysParaBank para) throws Exception;

}