交易的传播行为

时间:2011-04-05 10:43:42

标签: java spring transactions spring-aop

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

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

}
}

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

第二个问题:

method2,method3等任何方法的失败都会导致事务回滚吗?

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

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

3 个答案:

答案 0 :(得分:34)

回答此评论,而非实际问题:

  

交易是特定于会议的或   要求特定 - Vish 3小时前

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

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


在下面的评论中回答这个问题:

  

谢谢@sean,我仍然无法得到   回答其他传播的地方   像PROPAGATION_SUPPORTS这样的行为   ,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW   使用等。请参考上面的   整个问题

以下是我的评论Propagation值列表:

  

<强>强制性
  支持当前事务,如果抛出异常   没有。

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

  

<强> NESTED
  如果是当前事务,则在嵌套事务中执行   存在,表现得像   PROPAGATION_REQUIRED其他。

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

  

<强> NEVER
  非事务性执行,如果是事务则抛出异常   存在。

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

  

<强> NOT_SUPPORTED
  非事务性执行,暂停当前事务(如果有)   存在。

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

  

<强> REQUIRED
  支持当前事务,如果没有,则创建一个新事务   存在。

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

  

<强> REQUIRES_NEW
  创建一个新事务,暂停当前事务(如果有)   存在。

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

  

<强>支持
  支持当前事务,执行   非交易的,如果不存在的话。

如果有一个交易,但不需要一个交易(也不会开始新交易),可以使用交易。


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

答案 1 :(得分:3)

事务传播指示在调用给定方法时应该是什么行为。 REQUIRES_NEW表示即使正在进行的交易,也应始终启动新的交易。

例如,method1()定义REQUIRES_NEW,而不是在新事务中执行。

异常将回滚当前活动的事务,是的。

答案 2 :(得分:0)

是。 Requires_New表示每个请求都将启动新事务。如果在method2中失败,则method3将导致事务回滚,具体取决于回滚属性。 检查Transactional属性。