如何正确使用嵌套@Transactional
时间: 2023-07-05 13:28:58 浏览: 108
Spring @Transactional注解失效解决方案
5星 · 资源好评率100%
嵌套使用@Transactional注解的正确方式是:
1. 在外层方法上添加@Transactional注解,并设置propagation属性为REQUIRES_NEW,表示外层方法的事务将会被挂起,内层方法会开启新的事务。
2. 在内层方法上添加@Transactional注解,并设置propagation属性为REQUIRED,表示内层方法的事务将会使用外层方法的事务。
举个例子来说明,在Service层中有两个方法,一个是添加用户的方法addUser,另一个是添加用户地址的方法addUserAddress。这两个方法都需要开启事务,但是添加用户地址的方法应该在添加用户的事务中执行。因此,可以使用嵌套的方式来管理事务,具体代码如下:
```
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Autowired
private UserAddressDao userAddressDao;
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void addUser(User user) {
userDao.addUser(user);
// 调用添加用户地址的方法
addUserAddress(user.getId(), "北京市朝阳区");
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public void addUserAddress(Long userId, String address) {
userAddressDao.addUserAddress(userId, address);
}
}
```
在上面的代码中,添加用户的方法addUser使用了嵌套的方式来管理事务。在外层方法中,使用了@Transactional注解,并设置了propagation属性为REQUIRES_NEW,表示添加用户的方法将会开启新的事务。在内层方法中,使用了@Transactional注解,并设置了propagation属性为REQUIRED,表示添加用户地址的方法将会使用外层方法的事务。
使用嵌套的方式来管理事务时,需要注意以下几点:
1. 内层方法的事务将会受外层事务的影响,如果外层事务回滚,内层事务也会被回滚。
2. 内层方法的异常将会被传播到外层方法中,如果内层方法抛出异常,外层方法也会抛出异常。
3. 在使用嵌套的方式来管理事务时,需要特别注意事务的一致性问题,避免产生数据不一致的情况。
阅读全文