Java 事务的传播行为

Java 事务的传播行为,java,spring,transactions,spring-aop,Java,Spring,Transactions,Spring Aop,我正在为SpringAOP使用基于注释的声明性方法。 示例代码 ClassA{ @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) add() { method1(); method2(); method3(); } } 但我仍然怀疑传播的使用。传播是否需要新的方法,即每个请求将启动新的事务 第二个问题: 任何方法(如method2、method3)的失败是否会导致事务回滚 如果有人能帮我学习,我会

我正在为SpringAOP使用基于注释的声明性方法。 示例代码

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

}
}
但我仍然怀疑传播的使用。传播是否需要新的方法,即每个请求将启动新的事务

第二个问题:

任何方法(如method2、method3)的失败是否会导致事务回滚

如果有人能帮我学习,我会很高兴的

有人能给我一个现实世界的例子,我们需要参与现有的交易。因为我想象,我们在上述例子中使用的添加功能对所有用户都是独立的,或者任何其他功能对调用的每个用户都是独立的。我无法找到使用其他传播行为的示例,如传播支持、传播强制、传播要求、新等。意味着每个请求将启动新事务。如果method2、method3中出现Yes失败,则会导致事务回滚,具体取决于回滚属性。
检查属性。

事务传播指示调用给定方法时该方法的行为<代码>需要_NEW表示即使有正在进行的事务,也应始终启动新事务

例如,如果
method1()


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

回答此注释,而不是实际问题:


事务是特定于会话的,或者 具体要求–3小时前的Vish

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

@Transactional
的范围是每个方法调用,因为
@Transactional
是通过SpringAOP实现的。事务状态保存在
ThreadLocal
变量中,这些变量在输入最外层的
@transactional
方法时初始化,并在离开时用commit或rollback清除。整个抽象工作在Java方法级别,因此不需要web容器,也不从中获益


针对以下评论中的这一问题:


谢谢@sean,我还是没办法 回答其他传播的位置 类似于传播的行为 ,传播\u必需,传播\u需要\u新建 使用等。有关详细信息,请参阅上文 整个问题

以下是我的评论值列表:

强制性的
支持当前事务,如果 没有

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

嵌套的
在嵌套事务中执行,如果当前事务 存在,表现得像
传播\u必需
其他

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

从不
以非事务方式执行,如果事务 存在

不启动事务。如果存在事务,则失败

不受支持
以非事务性方式执行,如果需要,则暂停当前事务 存在

不启动事务。挂起任何现有事务

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

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

需要新的
创建一个新事务,如果需要,则暂停当前事务 存在

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

支持
支持当前事务,执行 如果不存在,则为非事务性

如果存在事务,则可以使用事务,但不需要事务(并且也不会启动新事务)



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

事务是特定于会话或特定于请求的。谢谢@sean,我仍然无法得到其他传播行为的答案,如传播支持、传播强制、传播REQUIRES\u NEW等。请参考上面的完整问题Thank@Sean。因此,如果多个请求调用同一个方法,比如ADD(),所需的注释将使它们在同一事务中运行???。但我认为所有ADD()方法调用在事务方面都是相互独立的。仍然有一些问题confusion@Vish不,从来没有。新请求总是意味着在新线程中调用新方法,从而产生新事务。所有这些事务性的东西都发生在一个方法调用中,最外层的方法调用。当外部方法调用内部事务性方法时会变得很棘手,但是两次调用外部方法意味着两个事务,不管它是否在web上下文中。您能解释一下吗>事务状态保存在ThreadLocal变量中,这些变量在输入最外层的@transactional方法时初始化,在离开时用commit或rollback清除。@Sean Patrick Floyd请解释传播从不和根本不用transactional标记方法之间的区别