Transacional方法的Spring重试不执行相同的步骤序列

时间:2016-04-18 14:31:54

标签: spring spring-retry

我想在发生JpaOptimisticLockingFailureException时重试事务服务方法

当我使用@Retryable注释

注释服务方法时
@Retryable(value = JpaOptimisticLockingFailureException.class, maxAttempts = 3, backoff = @Backoff(delay = 500, maxDelay = 1000))
Account create(AccountDtoCreate dto);

,服务方法执行以下逻辑

@Transactional
public Account create(AccountDtoCreate dto) {
    Account account = mapper.map(dto, Account.class);

    Schema schema = schemaService.getByCode(dto.getSchemaCode());       
    account.getSchemas().add(schema);

    Customer customer = customerService.findOrCreate(dto.getCustomer());
    account.setCustomer(customer);

    Account savedAccount = repository.save(account);
    repository.flush();
    return savedAccount;
    }
}

我一次执行2个请求(创建发生JpaOptimisticLockingFailureException的情况)。

第一个事务被提交,第二个抛出JpaOptimisticLockingFailureException并重试。

在插入客户时重试尝试失败,而不是调用findOrCreate方法,甚至是getByCode方法

是否可以使其正确重试?

1 个答案:

答案 0 :(得分:0)

经过调查,这是我使用@Transactional注释的方式的问题。 Create方法永远不会正确回滚。