@Transactional 方法互相调用
时间: 2023-11-16 22:00:33 浏览: 46
在一个类的内部,事务之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务。但是,如果不同类之间的方法调用,如类A的方法a()调用类B的方法b(),这种情况事务是正常起作用的。只要方法a()或b()配置了事务,运行中就会开启事务,产生代理。
代码示例:
```java
@Service
public class ServiceA {
@Autowired
private ServiceB serviceB;
@Transactional
public void methodA() {
// do something
serviceB.methodB();
// do something
}
}
@Service
public class ServiceB {
@Transactional
public void methodB() {
// do something
}
}
```
在上面的代码示例中,当ServiceA的methodA()方法被调用时,它会开启一个事务。在methodA()方法中调用了ServiceB的methodB()方法,由于methodB()方法也配置了事务,所以会在运行时开启一个新的事务。这样,methodB()方法就在methodA()方法的事务中运行。
相关问题
@Transactional事物方法互相调用
@Transactional 注解用于在 Spring 中管理事务。当一个方法被 @Transactional 注解修饰时,Spring 会为该方法开启一个事务,并在方法执行过程中进行事务管理。
如果在一个事务方法内部调用另一个带有 @Transactional 注解的方法,Spring 默认会使用当前事务来执行被调用的方法。这样,被调用的方法会加入到当前事务中,与调用方共享同一个事务。
在这种情况下,如果被调用的方法执行过程中发生异常,或者被调用的方法内部触发了事务回滚条件(如抛出 RuntimeException),那么整个事务都会被回滚,包括调用方和被调用方的操作。如果被调用的方法执行成功,则整个事务提交。
示例代码如下:
```java
@Service
public class TransactionalService {
@Transactional
public void methodA() {
// 执行一些业务逻辑
// 调用 methodB() 方法
methodB();
// 继续执行一些业务逻辑
}
@Transactional
public void methodB() {
// 执行一些业务逻辑
}
}
```
在上面的例子中,methodA() 方法和 methodB() 方法都被 @Transactional 注解修饰,因此它们都会运行在同一个事务中。如果 methodB() 方法执行过程中发生异常,整个事务会被回滚,包括 methodA() 方法的操作。
需要注意的是,为了 @Transactional 注解能够生效,你需要在 Spring 配置文件中启用事务管理器,并确保被注解的方法是通过 Spring 容器进行调用的。
@Transactional注解的使用注意事项有哪些?
@Transactional注解的使用注意事项包括:
1. 事务的传播行为:@Transactional注解可以设置事务的传播行为,包括REQUIRED(默认)、REQUIRES_NEW、SUPPORTS、NOT_SUPPORTED等。在调用其他方法时,需要注意当前方法是否需要参与事务。
2. 异常处理:默认情况下,Spring事务管理器只在遇到RuntimeException及其子类时才会回滚事务,而对于Checked Exception不会回滚。如果需要让Checked Exception也回滚事务,可以使用rollbackFor属性指定异常类型。
3. 数据源选择:如果系统中使用了多个数据源,@Transactional注解可以指定具体的数据源,通过设置value属性或者dataSource属性来选择特定的数据源。
4. 方法内部调用问题:在同一个类中的方法互相调用时,事务注解可能不起作用。这是因为Spring使用了基于代理的AOP来实现事务管理,而同一个类中的方法调用并不会通过代理对象,因此事务注解会失效。可以通过将事务注解放在独立的类中或者使用AopContext.currentProxy()来解决这个问题。
5. 异步方法问题:使用@Transactional注解修饰的异步方法可能会失效。这是因为异步方法会在另外一个线程中执行,而事务上下文可能无法正确传播到新的线程中。可以考虑使用TransactionTemplate来手动控制事务。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)