@Transactional(rollbackFor = Exception.class) 使@DataSource 解释形 的切换数据库失效,如何解决
时间: 2023-07-21 09:23:19 浏览: 263
在 Spring 中,@Transactional 注解会创建一个代理对象来实现事务的管理。这个代理对象会拦截方法调用,并在事务开始和结束时处理事务的提交和回滚。因此,在使用 @Transactional 注解时,需要确保该注解被正确地应用在目标方法上。
如果 @Transactional 注解和 @DataSource 注解同时使用,可能会导致 @DataSource 注解失效,因为代理对象只会拦截目标方法,而不会拦截代理对象本身的方法调用。因此,解决这个问题的方法是将 @DataSource 注解应用在实现类上,而不是接口或抽象类上。
示例代码:
```
@DataSource("dataSource1")
@Service
public class UserServiceImpl implements UserService {
@Transactional(rollbackFor = Exception.class)
public void addUser(User user) {
// ...
}
}
```
在上面的示例中,@DataSource 注解被应用在 UserServiceImpl 类上,而不是 UserService 接口上。这样,即使使用了 @Transactional 注解,也能正确地切换数据源。
阅读全文