java - 如何在相同和不同的服务中调用 @Transactional 和非事务方法时回滚事务?

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

我正在使用 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。我该怎么做?

最佳答案

您不需要定义 rollbackFor = {Throwable.class} 。 默认全部RuntimeException使用@Transactional时进行回滚.

这可能是因为您正在使用中间非 @Transactional注解方法,主事务被挂起并创建一个嵌套事务。

尝试输入 @Transactional在你的public void generateInvoice()然后Propagation.REQUIRED应与发票回滚一起应用

关于java - 如何在相同和不同的服务中调用 @Transactional 和非事务方法时回滚事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52554520/

相关文章:

java - Spring 安全: How to access authenticated user in asynchronous Jobs

java - 使用 GSON : JsonSyntaxException: java. lang.IllegalStateException 进行 Json 解析:预期为 BEGIN_OBJECT,但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY

java - 生成网站缩略图?

java - Spring MVC 端点在将空映射 {} 传递到 GET 请求时无法获取

spring - 为什么Springboot的JPA实体是抽象的?

java - EntityManager 与 Spring Data 存储库的显式使用

java - 由 : java. lang.IllegalArgumentException : org. hibernate.QueryException 引起:无法解析属性:customerNumber of:

java - 为什么在 eclipse kepler 中导入 gradle 后缺少依赖项

java - 使程序在自身内重复,但不能创建方法(?): Java

javascript - 在执行期间扫描 JSP 页面时,将首先扫描页面的哪一部分