Java中方法a上有@Transactional,其内部方法b里也有@Transactional,如果通过事务传播实现方法a里有异常并不会影响b事务
时间: 2024-03-15 20:42:04 浏览: 23
这个问题涉及到Spring事务传播机制,可以通过设置不同的事务传播行为来控制事务的行为。在这个情况下,如果方法a上的@Transactional注解的事务传播行为设置为REQUIRED(即默认的传播行为),则方法b也会加入到方法a的事务中,如果方法a发生异常回滚事务,方法b也会回滚事务。如果方法a上的@Transactional注解的事务传播行为设置为REQUIRES_NEW,则方法b会开启一个新的事务,方法a的异常不会影响方法b的事务。因此,如果你希望方法a的异常不会影响方法b的事务,可以将方法a上的@Transactional注解的事务传播行为设置为REQUIRES_NEW。
相关问题
Java中方法a上有@Transactional,其内部方法b和c里也有@Transactional,如何通过事务传播实现方法a里有异常并不会影响b和c事务
可以使用Spring的事务传播机制来实现这个需求。在方法a上使用@Transactional注解,并设置propagation属性为REQUIRED(默认值),表示使用当前事务,如果当前没有事务,则新建一个事务。在方法b和c上的@Transactional注解中,设置propagation属性为REQUIRES_NEW,表示新建一个事务,如果当前存在事务,则将当前事务挂起。这样,在方法a中发生异常时,只会回滚方法a中的事务,而不会影响方法b和c中的事务。
具体实现如下:
```java
@Service
public class ServiceA {
@Autowired
private ServiceB serviceB;
@Autowired
private ServiceC serviceC;
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// do something
serviceB.methodB();
serviceC.methodC();
// do something
throw new RuntimeException("Exception in methodA");
}
}
@Service
public class ServiceB {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// do something
if (someCondition) {
throw new RuntimeException("Exception in methodB");
}
// do something
}
}
@Service
public class ServiceC {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodC() {
// do something
if (someCondition) {
throw new RuntimeException("Exception in methodC");
}
// do something
}
}
```
在这个例子中,方法a调用了方法b和c,并在方法a中抛出了异常。如果方法b或c中发生异常,则只会回滚方法b或c对应的事务,不会影响方法a中的事务。
Java中方法a上有@Transactional,其内部方法b和c上也有@Transactional,如何通过事务传播实现方法a里有异常并不会影响b和c事务
可以通过设置@Transactional注解的propagation属性来实现事务传播,并且通过设置@Transactional注解的rollbackFor属性来指定回滚的异常类型。在方法a上设置@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class),表示a方法需要一个事务,并且b和c方法需要加入到a方法的事务中,同时如果发生任何异常(Exception及其子类),事务都会回滚。如果b或c方法发生异常,事务会回滚,但是a方法的事务并不会受到影响。如果需要b和c方法单独开启事务,则可以将@Transactional注解的propagation属性设置为Propagation.REQUIRES_NEW。这样b和c方法会开启一个新的事务,与a方法的事务独立,即使a方法的事务回滚,b和c方法的事务依然可以提交。
相关推荐
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)