gpt4 book ai didi

java - 带@Transactional(propagation = Propagation.SUPPORTS) 的方法和不带@Transactional 的方法有什么区别?

转载 作者:行者123 更新时间:2023-11-30 06:59:21 25 4
gpt4 key购买 nike

方法与

有什么区别
@Transactional(propagation = Propagation.SUPPORTS)

还有一个没有@Transactional的方法?

例如:

public class TEst {

@Transactional
public void methodWithTransaction1(){
methodWithSupportsTransaction();
}

@Transactional
public void methodWithTransaction2(){
methodWithoutTransactional();
}

@Transactional(propagation = Propagation.SUPPORTS)
public void methodWithSupportsTransaction(){

}

public void methodWithoutTransactional(){

}
}

最佳答案

除了在the javadoc中指出的细微差别外关于同步,两者之间的区别在于,如果方法用 Transactional 注释,则事务代理会拦截方法调用,并且如果从该方法抛出运行时异常,则将当前事务(如果有)标记为 rollbackOnly。

那么,让我们举个例子:

public class A {
@Autowired B b;

@Transactional
public void foo() {
try {
b.bar();
}
catch (RuntimeException e) {
// ignore
}

...
}
}

public class B {
// @Transactional(propagation = Propagation.SUPPORTS)
public void bar() {
throw new RuntimeException();
}
}

调用 a.foo() 将启动一个事务(如果事务不存在)(需要传播)。然后 b.bar() 将被调用并抛出异常。异常被 a.foo() 捕获,它继续执行,就好像什么也没发生一样。在a.foo()结束时,事务将成功提交。

现在让我们取消注释 b.bar() 上的事务注释。如果事务不存在,则调用 a.foo() 将启动一个事务(需要传播)。然后 b.bar() 将被调用并抛出异常。这个异常将被 B 周围的事务代理“拦截”,它将事务标记为 rollbackOnly。然后异常将传播到 A.a.foo()。异常被 a.foo() 捕获,它继续执行,就好像什么也没发生一样。在 a.foo() 结束时,事务将被提交,但提交将失败,因为事务已被标记为 rollbackOnly。 a.foo() 的调用者将得到一个 TransactionSystemException。

关于java - 带@Transactional(propagation = Propagation.SUPPORTS) 的方法和不带@Transactional 的方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31634239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com