2011-04-05 90 views
8

我正在使用基于注释的声明式方法来处理spring aop。 示例代码交易的传播行为

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

} 
} 

但我仍然怀疑在使用propagation.does的propagation.Requires_New意味着每个请求将开始新的事务。

第二个问题:

是否像方法2的任何方法的失败,方法3将导致事务回滚?

如果有人能帮助我倾向交易传播,我会非常高兴。

有人可以为我提供一个真实世界的例子,我们需要参与现有的事务。因为我想象上面例子中使用的add函数将独立于所有用户,或者任何其他函数都将独立于每个函数正在呼叫的用户。我无法找到使用其他传播行为(如PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW等)的示例

回答

31

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

交易是会话特定或 具体要求 - Vish 2小时前

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

@Transactional的范围是按方法调用的,因为@Transactional是通过Spring AOP实现的。事务状态保存在ThreadLocal变量中,当最外面的@Transactional方法被输入时,该变量被初始化,并在离开时被提交或回滚清除。整个抽象在Java方法级别上工作,因此不需要或从Web容器中获利。


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

感谢@肖恩,我是还是老样子没能获得 答案在其它传播 行为像PROPAGATION_SUPPORTS ,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW 等等。请参考上面 整个问题

这里的Propagation值与我的意见列表:

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

不开始一个新的事务处理,只检查交易是否是活动的(必须是另一个@Transactional方法呼叫或编程方式创建的事务内部)

NESTED
执行内嵌套交易如果当前交易 存在,则表现得像 PROPAGATION_REQUIRED else。

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

NEVER
执行非事务,如果事务 存在抛出异常。

不启动交易。如果交易存在,则失败。

NOT_SUPPORTED
执行非事务,如果一个 存在暂停当前事务。

不启动交易。暂停任何现有的交易。

REQUIRED
支持当前事务,创造,如果没有 存在一个新的。

如果存在事务,则使用该事务,如果没有,则创建一个新事务。 95%的情况下,这是你需要的。

REQUIRES_NEW
创建一个新的事务,如果一个 存在暂停当前事务。

总是创建一个新的事务,无论是否存在现有的事务。如果存在,它将在此方法执行期间暂停。

SUPPORTS
支持当前事务,执行 非事务如果不存在。

可以使用事务如果存在,但并不需要一个(也不会开始一个新的)


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

+0

谢谢@ sean,我仍然无法获得其他传播行为,如PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW等等。请参考上面的整个问题 – Vish 2011-04-06 06:23:38

+0

Thanks @ Sean.so如果多个请求都调用相同的方法说ADD(),REQUIRED注释会使它们在同一个事务中运行??但我认为所有的Add()方法调用都会在交易方面彼此独立..仍然有点混乱 – Vish 2011-04-06 11:21:17

+1

@Vish不,从不。新的请求总是意味着在新线程中新的方法调用,因此是新的事务。所有这些事务性的东西都发生在一个方法调用中,即最外面的一个。当外部方法调用内部事务方法时,会变得棘手,但调用外部方法两次意味着两个事务,无论它是否在Web上下文中。 – 2011-04-06 13:19:19

0

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

+0

交易是会话特定的或请求特定的 – Vish 2011-04-05 11:16:27

1

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

例如,如果method1()定义为REQUIRES_NEW,则它将在新事务中执行。

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