spring事务问题(三) - 嵌套事务(NESTED)
嵌套事务
|--主事务开始
| ------------嵌套事务1
| ------------嵌套事务2
|--主事务结束
现有两个类:
@Component
public class UserManager {
@Autowired
private UserDao userDao;
@Transactional(propagation = Propagation.NESTED)
public void insertMember(){
UserDo userDo = new UserDo();
userDo.setUserName("bbb");
userDo.setAge(14);
userDo.setCreateTime(new Date());
userDo.setUpdateTime(new Date());
userDao.insert(userDo);
int i =1/0;
}
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Autowired
private UserManager userManager;
@Transactional(propagation = Propagation.REQUIRED)
public void insertUser(){
UserDo userDo = new UserDo();
userDo.setUserName("aaa");
userDo.setAge(12);
userDo.setCreateTime(new Date());
userDo.setUpdateTime(new Date());
userDao.insert(userDo);
try {
userManager.insertMember();
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试一
insertUser方法事务传播方式为required, 而insertMember方法传播方式为nested
测试类
@Test
public void testA(){
userService.insertUser();
}
测试结果:
插入username为aaa 的数据,但是 username为bbb的数据没有插入,即在嵌套事务内出现异常,嵌套事务不影响主事务的流程。这点和required相反,如果inserMember事务换成required, 那么,两条数据都不会插入,并且主事务提交时会报Transaction rolled back because it has been marked as rollback-only
测试二
两个方法的事务传播方式不变,将 int i=1/0
移到 insertUser
方法中去, 即
@Component
public class UserManager {
@Transactional(propagation = Propagation.NESTED)
public void insertMember(){
UserDo userDo = new UserDo();
userDo.setUserName("bbb");
userDo.setAge(14);
userDo.setCreateTime(new Date());
userDo.setUpdateTime(new Date());
userDao.insert(userDo);
}
}
@Service
public class UserService {
@Transactional(propagation = Propagation.REQUIRED)
public void insertUser(){
UserDo userDo = new UserDo();
userDo.setUserName("aaa");
userDo.setAge(12);
userDo.setCreateTime(new Date());
userDo.setUpdateTime(new Date());
userDao.insert(userDo);
try {
userManager.insertMember();
} catch (Exception e) {
e.printStackTrace();
}
int i =1/0;
}
}
测试结果
两条数据都没有插入
嵌套事务Nested和required_new传播方式的区别
对于测试一的测试,两者的结果一样
对于测试二的测试,测试结果不同:
@Component
public class UserManager {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertMember(){
UserDo userDo = new UserDo();
userDo.setUserName("bbb");
userDo.setAge(14);
userDo.setCreateTime(new Date());
userDo.setUpdateTime(new Date());
userDao.insert(userDo);
}
}
@Service
public class UserService {
@Transactional(propagation = Propagation.REQUIRED)
public void insertUser(){
UserDo userDo = new UserDo();
userDo.setUserName("aaa");
userDo.setAge(12);
userDo.setCreateTime(new Date());
userDo.setUpdateTime(new Date());
userDao.insert(userDo);
try {
userManager.insertMember();
} catch (Exception e) {
e.printStackTrace();
}
int i =1/0;
}
}
测试结果:
username为bbb的数据插入数据库,而数据aaa却没有插入数据库