【问题标题】:How to rollback transaction on calling @Transactional and non-Transactional method in same and different Service?如何在相同和不同的服务中调用@Transactional 和非事务方法时回滚事务?
【发布时间】:2019-03-04 09:41:00
【问题描述】:

我正在使用 Spring Data Rest 和 Spring JPA。我有一种方法可以更新一个数据库表。

@Autowired InvoiceClient;

@Override
@Transactional
public String doBilling(String x){
//get date from TableOne
Bill bill = billsRepository.getBill(x);
if(bill.isPaid()){
    generateInvoice();
}
bill.setPaymentDate(new Date());
return "SUCCESS";
}

generateInvoice 是从其他服务调用@Transactional 方法的非事务方法。

public void generateInvoice(){
    invoiceClient.generateInvoice();//this is @Transactional, make changes in TableTwo
}

如果 generateInvoice 方法出现任何异常,整个事务将回滚。 现在我想再添加一种方法,其中包含账单编号列表。我在循环中调用 doBilling 方法对所有账单进行计费。

@Override
@Transactional(readOnly = false, rollbackFor = {Throwable.class}, propagation = Propagation.REQUIRED)
public String doBillingForAll(List<String> tx){
    for(String x: tx){
         doBilling(x);
    }
}

但是现在,如果 doBilling 方法出现任何异常,所有 setPayment 方法都将回滚,但 generateInvoice 仍然存在。 我也想回滚 generateInvoice 。我该怎么做?

【问题讨论】:

    标签: java spring spring-data-jpa spring-data-rest distributed-transactions


    【解决方案1】:

    您无需定义rollbackFor = {Throwable.class}。 默认情况下,所有RuntimeException 在使用@Transactional 时都会进行回滚。

    可能是因为你使用了中间非@Transactional注解的方法,所以主Transaction被挂起并创建了一个嵌套的。

    尝试将@Transactional 放入您的public void generateInvoice(),然后在回滚您的发票时应用Propagation.REQUIRED

    【讨论】:

    • 我尝试在 generateInvoice() 方法中添加@Transactional,但它仍然无法正常工作。此外,我的服务类已经用 @Transational(readOnly = false) 注释进行了注释。
    • invoiceClient.generateInvoice() 调用一个接口,该接口又调用 generateInvoice() 方法的实现。我的猜测是,正因为如此,为此方法调用创建了一个新事务。
    • 你能尝试在generateInvoice() 上使用@Transactional(propagation = Propagation.SUPPORTS) 并告诉我会发生什么吗?
    • Propagation.SUPPORTS 如果不存在事务,则非事务性执行。但是在这种情况下,该类已经用 @Transaction 进行了注释,那么它会有什么不同呢?
    • 您将检查是否已经创建了另一个事务。如果有异常,说明其他地方有问题。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多