我正在使用基于注释的声明式方法来实现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等其他传播行为的示例
答案 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
注释中的默认值)。我个人从未见过任何其他价值,但REQUIRED
和REQUIRES_NEW
正在使用中。
答案 1 :(得分:3)
事务传播指示在调用给定方法时应该是什么行为。 REQUIRES_NEW
表示即使正在进行的交易,也应始终启动新的交易。
例如,method1()
定义REQUIRES_NEW
,而不是在新事务中执行。
异常将回滚当前活动的事务,是的。
答案 2 :(得分:0)
是。 Requires_New表示每个请求都将启动新事务。如果在method2中失败,则method3将导致事务回滚,具体取决于回滚属性。 检查Transactional属性。