交易的传播行为

Vis*_*ish 8 java spring transactions spring-aop

我正在使用基于注释的声明方法来实现spring aop.示例代码

ClassA{
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
add()
{
method1();
method2();
method3();

}
}
Run Code Online (Sandbox Code Playgroud)

但我仍然怀疑使用传播.传播.Requires_New意味着每个请求都将启动新事务.

第二个问题:

是不是像method2,method3这样的方法失败会导致事务回滚?

如果有任何可以帮助我倾斜交易传播,我将非常高兴.

有人可以为我提供一个真实世界的例子,我们需要参与现有的交易.因为我想象我们在上面的例子中使用的添加功能将对所有用户独立,或者任何其他功能将独立于每个正在呼叫的用户.我无法找到使用PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW等其他传播行为的示例

Sea*_*oyd 36

回答这个评论,而不是实际的问题:

交易是特定于会话或特定于请求 - 3小时前

都不是.请求和会话都是特定于Web的范围,而Spring Transaction抽象与Web技术无关.

@Transactional每个方法调用的范围,@Transactional通过Spring AOP实现.事务状态保存在ThreadLocal变量中,这些变量在输入最外层@Transactional方法时初始化,并在保留时通过提交或回滚清除.这整个抽象适用于Java方法级别,因此不需要Web容器或从Web容器中获利.


并在以下评论中回答此问题:

谢谢@sean,我仍然无法得到答案,其中使用了PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW等其他传播行为.请参阅上面的整个问题

这是Propagation我的评论值列表:

强制
支持当前事务,如果不存在则抛出异常.

不启动新事务,只检查事务是否处于活动状态(必须在另一个@Transactional方法调用或以编程方式创建的事务中)

NESTED
如果存在当前事务,则在嵌套事务中执行,其行为与PROPAGATION_REQUIREDelse 类似 .

如果事务存在,则启动嵌套事务,否则启动新事务.

永远
不以事务方式执行,如果事务存在则抛出异常.

不开始交易.如果存在交易,则会失败.

NOT_SUPPORTED
非事务性执行,暂停当前事务(如果存在).

不开始交易.暂停任何现有交易.

必需
支持当前事务,如果不存在则创建新事务.

如果存在事务,则使用该事务,否则创建一个新事务.在95%的情况下,这就是您所需要的.

REQUIRES_NEW
创建一个新事务,暂停当前事务(如果存在).

无论是否存在现有交易,始终都会创建新交易.如果有,它将在此方法执行期间暂停.


支持支持当前事务,如果不存在则以非事务方式执行.

可以使用一个事务,但不需要一个事务(也不会启动一个事务)


在大多数情况下,REQUIRED您需要的是(因此它是@Transactional注释中的默认值).我个人从来没有见过任何其他值,但REQUIREDREQUIRES_NEW使用.