spring 宣告式事務傳播特性詳解(包括異常回滾舉例)
阿新 • • 發佈:2019-01-08
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;
}