何时使用 @Transactional 的 propagation=Propagation.REQUIRES_NEW?

5

我的问题很简单,几乎已经在标题中说明了:是否有特定的模式/用例,可以说@ Transactional(propagation = Proagation.REQUIRES_NEW)而不是使用默认传播?

谢谢!

2个回答

6

编写审计跟踪。您希望记录某人尝试执行某项操作的事实,无论主要交易是否成功或失败(因此被回滚)。


这意味着内部事务始终会被执行,即使外部事务没有被执行? - Erik
1
@Erik,是的。顺便说一下,在JTA(在幕后使用)中没有内部事务的概念。现有的事务被暂停,新事务开始。在新事务终止(提交或回滚)时,现有事务将被恢复。 - Vineet Reynolds
1
是的,它们是不同的,还有一个完全不同的概念叫做“嵌套”事务,其中嵌套事务依赖于外部事务。EJB不支持嵌套事务。 - djna

4
具体用途包括需要在方法中执行某些工作并在继续现有事务之前提交它的情况。例如,“审计”(而不是日志记录)方法调用,您希望提交审计条目,无论现有业务交易最终是否提交或回滚。另一个场景是从门面调用多个业务交易,并且每个这样的调用都必须在返回控制权给门面之前提交其工作。这种情况非常罕见,但您可能会在工作流系统中找到它(其中进展的条目被记录),并且在同一应用程序中驻留的其他组件上进行的调用必须在单独的事务中发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接