由于项目需要系统调用别系统接口的记录接口调用与报错信息的需求,需要开启一个手动控制的事务进行存储,在事务中开一个新的事务,我采用的编程式事务,所以记录一下
//@Async 开启异步的注解 使用这个注解前提下是启动类中使用@EnableAsync(开启全局异步)
@Async
public void addRecord(String businessId,
String requestJson,
String responseJson,
String methodName,
Integer messageType,
Integer interactionType,
String status,
String message
) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
/*PROPAGATION_REQUIRES_NEW: 事物隔离级别,开启新事务*/
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus transactionStatus = transactionManager.getTransaction(def);
try {
FinanceInteractionRecordEntity entity = new FinanceInteractionRecordEntity();
entity.setId(BizIdGenerator.getInstance().generateBizId())
.setBusinessId(businessId)
.setRequestJson(requestJson)
.setResponseJson(responseJson)
.setMethodName(methodName)
.setMessageType(messageType)
.setInteractionType(interactionType)
.setMessage(message)
.setStatus(status);
financeInteractionRecordMapper.insert(entity);
transactionManager.commit(transactionStatus);
} catch (Exception e) {
transactionManager.rollback(transactionStatus);
log.error("编程式事务业务异常回滚", e);
}
}
我是在一个事务中开一个新的事务,这里有个点需要注意一下:
TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
这样配置的话,spring默认会使用外面的事务级别,所以按情况开启自己想要的事务可以
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
/*PROPAGATION_REQUIRES_NEW: 事物隔离级别,开启新事务*/
def.setPropagationBehavior("这里配置事务隔离级别");