
事务在某些情况下可能不会按预期那样工作,以下是一些常见的原因:
null,因为数据尚未被持久化到数据库中。try...catch语句捕获,并且没有通过throw new RuntimeException重新抛出,则事务不会回滚。@Transactional(propagation = Propagation.NOT_SUPPORTED)会导致事务不起作用。RuntimeException之外的异常,而这些异常又不在@Transactional的rollbackFor属性中声明,则事务不会回滚。@Transactional注解使用不当。// 判断当前是否在事务内
if (!TransactionSynchronizationManager.isActualTransactionActive()) {
// 异步更新执行数据
log.info("无事务异步更新执行数据|event:{}, actInst:{}", executionTmp.getEventName(), executionTmp.getActivityInstanceId());
camundaGlobalListenerDelegate.redisDelayQueueUtil.addDelayQueue(executionTmp, RedisDelayQueueEnum.PROCESS_EXECUTION_RECORD);
} else {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
// 异步更新执行数据
log.info("异步更新执行数据|event:{}, actInst:{}", executionTmp.getEventName(), executionTmp.getActivityInstanceId());
camundaGlobalListenerDelegate.redisDelayQueueUtil.addDelayQueue(executionTmp, RedisDelayQueueEnum.PROCESS_EXECUTION_RECORD);
}
});
}
事务传播行为描述了当一个事务方法调用另一个事务方法时,如何处理这些事务之间的关系。以下是几种不同的传播行为及其含义:
Propagation.REQUIRED
Propagation.SUPPORTS
Propagation.MANDATORY
Propagation.REQUIRES_NEW
Propagation.NOT_SUPPORTED