Java Spring事务管理@Transactional行为
我想知道Spring@Transactional将如何用于以下编码场景。在这个示例中,我将Spring4+Hibernate5与Oracle 19C数据库一起使用 示例1: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.
@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
基本上不存在。