java - 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() {
// ...
}
}
谢谢
解决方案
示例 1:当您从服务中调用 createPDF 方法时,@Transactional inside
(REQUIRES_NEW) 注释实际上将是ignored
. 不会有新的交易开启。
示例 2:当您调用另一个服务时,该服务包装在事务代理中,您将得到一个new transaction
,因为注释受到尊重。
您可能还想阅读这篇文章:Spring 事务管理:@Transactional In-Depth
推荐阅读
- python - “按钮”对象不可调用
- php - Illuminate\Contracts\Container\BindingResolutionException 目标类 [HotelSeeder] 不存在
- pandas - Pandas - 计算来自另一列的单元格选择的平均值
- java - 如何忽略数据库中的字段
- java - Restful - Moxy 无法在 weblogic 14c 中正确解组
- angular - 如何在谷歌地图中显示多边形上的点(不可编辑)?
- postgresql - SQL - 组合多列并应用 ILIKE
- mysql - 如何将机器添加到 SQL 数据库中已经分片的数据?
- typescript - 如何访问打字稿中的函数?
- html - 在 Bootstrap 的两列之间留下一个空的 col-md-1 以留出间距?