@Transtation方法内部直接调用

@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);
    }
}

在这里插入图片描述

将事务挪位置后,数据库数据被删除没有回滚,说明方法在该类内部调用的时候事务会失效,但是将事务放在主方法上时候不会失效,根本原因调用对象不同,搞不懂原理就实践吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值