首页 > 解决方案 > Spring事务管理@Transactional行为

问题描述

我想知道 Spring @Transactional 如何在以下编码场景中工作。我在这个例子中使用 Spring 4 + Hiberante 5 和 Oracle 19C 数据库。

示例 1:

@Service
public class UserService {
    @Transactional(readOnly = true)
    public void invoice() {
        createPdf();
        // send invoice as email, etc.
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void createPdf() {
        // ...
    }
}

示例 2:

@Service
public class UserService {
    @Autowired
    private InvoiceService invoiceService;
    @Transactional(readOnly = true)
    public void invoice() {
        invoiceService.createPdf();
        // send invoice as email, etc.
    }
}
@Service
public class InvoiceService {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void createPdf() {
        // ...
    }
}

谢谢

标签: javaspringhibernatetransactionsspring-transactions

解决方案


示例 1:当您从服务中调用 createPDF 方法时,@Transactional inside(REQUIRES_NEW) 注释实际上将是ignored. 不会有新的交易开启。

示例 2:当您调用另一个服务时,该服务包装在事务代理中,您将得到一个new transaction,因为注释受到尊重。

您可能还想阅读这篇文章:Spring 事务管理:@Transactional In-Depth


推荐阅读