Java Spring事务管理@Transactional行为

Java Spring事务管理@Transactional行为,java,spring,hibernate,transactions,spring-transactions,Java,Spring,Hibernate,Transactions,Spring Transactions,我想知道Spring@Transactional将如何用于以下编码场景。在这个示例中,我将Spring4+Hibernate5与Oracle 19C数据库一起使用 示例1: @Service public class UserService { @Transactional(readOnly = true) public void invoice() { createPdf(); // send invoice as email, etc.

我想知道Spring@Transactional将如何用于以下编码场景。在这个示例中,我将Spring4+Hibernate5与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() {
        // ...
    }
}
@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() {
        // ...
    }
}
示例2:

@Service
public class UserService {
    @Transactional(readOnly = true)
    public void invoice() {
        createPdf();
        // send invoice as email, etc.
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void createPdf() {
        // ...
    }
}
@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() {
        // ...
    }
}

谢谢

示例1:当您从服务内部调用createPDF方法时,@Transactional(REQUIRES_NEW)注释将被有效地忽略。不会有新的交易打开

示例2:当您正在调用另一个服务时(该服务包装在事务代理中),您将得到一个
新事务,因为注释是受尊重的

您可能还想阅读本文:

第一个被称为self-call,它不经过
TransactionInterceptor
(它只是使用
this
而不是Spring事务包装器对象),因此
createPdf()
上的
@Transactional
基本上不存在。