好处:可以解决Spring AOP 声明式事务,同一个类中,方法 嵌套 事务失效 的 问题。
@Autowired
private TransactionTemplate transactionTemplate; // org.springframework.transaction.support.TransactionTemplate
// 方式一:编程式事务和业务一起处理
public TruckBrokerInvoice insertInvocieAndUpdateOrder(InvoiceApplyDTO apply, String applyBillCode) {
List<String> ids = Arrays.asList(apply.getTruckBrokerOrderIds().split(","));
TruckBrokerInvoice record = new TruckBrokerInvoice();
record.setPartyId(Long.valueOf(apply.getPartyId()));
// ....
// 使用 编程式事务,可以 解决 spring aop 事务,同一个类中,方法嵌套,事务 失效的 问题
return transactionTemplate.execute(new TransactionCallback<TruckBrokerInvoice>() {
@Override
public TruckBrokerInvoice doInTransaction(TransactionStatus status) {
truckBrokerInvoiceDao.insertTruckBrokerInvoice(record);
// 更新本次开票 运输单的 开票状态 `billStatus`:'开票状态,0=待开票,1=已申请,2=已开票,3=已撤销',
for (String id : ids) {
TruckBrokerOrder brokerOrder = new TruckBrokerOrder();
brokerOrder.setTruckBrokerOrderId(Integer.valueOf(id));
brokerOrder.setTruckBrokerInvoiceId(record.getTruckBrokerInvoiceId().intValue());
brokerOrder.setBillStatus(TruckBrokerOrderBillStatusEnum.APPLY.getCode()); // 开票状态:已申请
brokerOrder.setUpdateMan(apply.getUpdateMan());
truckBrokerOrderDao.updateTruckBrokerOrder(brokerOrder);
}
return record;
}
});
}
// 方式二:独立处理编程式事务
public void batchInsert(List<ConfigCommodity> configCommodityList) {
transactionTemplate.execute((TransactionCallback<Void>) status -> {
for (ConfigCommodity commodity : configCommodityList) {
insert(commodity); // 调用dao层进行insert处理
// xxxxx 其他处理....
}
return null;
});
}
public void batchInsert(Xxxx xxx) {
transactionTemplate.execute((TransactionCallback<Void>) status -> {
// xxxxx 业务处理....
return null;
});
}