使用单独的重试逻辑在单个事务中执行 2 个方法

Execute 2 mthods in a songle transaction with separate Retry logic

以下是我的要求

begin trans
insertData();
updateData();
end trans

还可以说 insertDta 方法抛出一些错误然后我需要重试 5 次。与 updateData() 相同。我不应该同时重试这两种方法,即如果我重试 m2() 5 次它们 m1( ) 不应重试。 以下是正确的方法吗?我从另一个 class 调用 m3() 。 我担心的是拦截器是以正确和确定的顺序添加的。

@Repository
DaoA
{
    void insertData();
}

@Repository
DaoB
{
    void updateData();
}

下面是我的服务 class .

@Service
ServiceA 
{
    
    @Retryable(  maxAttempts = 5)
     public void m1 ()
     {
         
         daoA.insertData();
         
     }
    
    
     @Retryable(  maxAttempts = 5)
     public void m2 ()
     {
          daoB.updateData();
     }
    
    

    @Transactional
     public void m3 ()
     {
         
    
          m1();
          m2();
     }
    

m3() 需要在不同的 bean 中 - 直接在 class 中调用 m1()m2() 会绕过代理,它们不会被重试。

无论如何,交易都应该在重试逻辑之内,而不是相反;您需要为每次尝试开始一个新的交易。

如果我的要求正确,这应该适合你。

@Service
ServiceA {
    
    public void m1 () {
         daoA.insertData();
     }
    
    public void m2 () {
          daoB.updateData();
    }

    @Transactional
    @Retryable(value = {Exception.class}, maxAttempts = 5)
    public void m3 () {
          m1();
          m2();
    }
}

这将确保重试总数为 maxAttempts = 5