@Transtation方法内部直接调用
看好多博客写方法内部调用,要获取本地代理对象调用,或者抽成另外一个类再进行调用,虽然也可以实现,但是感觉写的不是最方便的处理方式,自己实验了一下,代码和结果如下:
@Test
void contextLoads4() throws Exception {
userService.saveAndDelete(2L);
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService {
@Transactional(rollbackFor = Exception.class)
@Override
public void saveAndDelete(Long id) {
this.delete(id);
int i=1/0;
User user = new User();
user.setId(id+1);
this.updateBatchById(Arrays.asList(user));
}
public void delete(Long id){
this.removeByIds(Arrays.asList(id));
}
}
执行日志如下:
刷新后结果没变
失效情景一:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService {
@Autowired(required = false)
private UserMapper userMapper;
@Override
public User selectByPrimaryKey(long longValue) {
return userMapper.selectByPrimaryKey(longValue);
}
@Override
public void saveAndDelete(Long id) {
this.delete(id);
int i=1/0;
User user = new User();
user.setId(id+1);
this.updateBatchById(Arrays.asList(user));
}
@Transactional(rollbackFor = Exception.class)
public void delete(Long id){
this.removeByIds(Arrays.asList(id));
}
}
失效情景二:
@Test
void contextLoads5() throws Exception {
userService.test(3L);
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService {
@Autowired(required = false)
private UserMapper userMapper;
@Override
public User selectByPrimaryKey(long longValue) {
return userMapper.selectByPrimaryKey(longValue);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void saveAndDelete(Long id) {
this.delete(id);
User user = new User();
user.setId(id+1);
user.setName("1111111");
this.updateBatchById(Arrays.asList(user));
int i=1/0;
}
public void delete(Long id){
this.removeByIds(Arrays.asList(id));
}
@Override
public void test(Long id){
this.saveAndDelete(id);
}
}
将事务挪位置后,数据库数据被删除没有回滚,说明方法在该类内部调用的时候事务会失效,但是将事务放在主方法上时候不会失效,根本原因调用对象不同,搞不懂原理就实践吧。