@Transactional 和 @Retryable 的问题

问题描述

如果我从 spring-retry 库中添加 @Retryable,我将无法在事务中执行数据库操作。这是我的代码结构的样子:

    public class ExpireAndSaveTrades {
    @Transactional(rollbackFor = MyException.class)
    public void expireAndSaveTrades(List<Trade> trades) {
        try {
            // these two MUST be executed in one transaction
            trades.forEach(trade -> dao.expireTrades(trade));
            dao.saveTrades(trades);
        } catch (Exception e) {
            throw new MyException(e.getMessage(),e);
        }
    }
}

public class Dao {
    @Retryable(value = CannotAcquireLockException.class,maxAttempts = 3,stateful = true,backoff = @Backoff(delay = 300,multiplier = 3))
    public void expireTrades(Trade trade) {
    try {
          tradeRepository.expire(trade.getId(),trade.getNewStopDate());
    } catch (CannotAcquireLockException e) {
          expireTrade(trade);
        }

    }

    @Retryable(value = CannotAcquireLockException.class,multiplier = 3))
    public void saveTrades(List<Trades> trades) {
    try {
          tradeRepository.saveAll(trades)
    } catch (CannotAcquireLockException e) {
              saveTrades(trades);
            }
    }
}

public interface TradeRepository extends JpaRepository<Trade,Integer> {
    @Modifying
    @Query(value = "update trade set stop_date=:new_stop_date where id=:id",nativeQuery = true)
    void expire(@Param("id") int id,@Param("new_stop_date") String newStopDate);
}

所以这就是我现在所在的位置:

  1. 不使用有状态(即有状态默认设置为 false) - 重试成功,但在结束时,我看到此异常:org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 和更新/保存的数据多次重试后回滚数据库表
  2. stateful = true - 不再发生重试

我浏览了许多 SO 帖子和博客,但找不到解决我的问题的方法。这里有人可以帮我吗?

编辑: 更新了我的问题以添加 try-catch 块这样,spring-retry 不会启动(我知道是因为我向 @Retryable 添加了一个侦听器来记录 { {1}}。我没有看到日志被打印出来。如果出现CannotAcquireLockException,事务也会静默回滚

retryContext

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)