Java中方法a上有@Transactional,其内部方法b和c里也有@Transactional,如何通过事务传播实现方法a里有异常并不会影响b和c事务
时间: 2024-03-15 08:44:16 浏览: 57
Java注解@Transactional事务类内调用不生效问题及解决办法
可以使用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中的事务。
阅读全文