美文网首页Java
SpringBoot + 事务回滚简单使用

SpringBoot + 事务回滚简单使用

作者: vincent_wujia | 来源:发表于2020-05-26 16:54 被阅读0次

    1、事务使用

    在代码中使用事务很简单,只需要在方法上添加好@Transactional注解即可

    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    /**
     * <p>
     *  服务实现类
     * </p>
     * @author 小吾
     * @since 2020-05-21
     */
    @Service
    public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    
        @Autowired
        private UserMapper userMapper;
    
        /**
         * 在方法上加上@Transactional注解,即可
         */
        @Transactional(rollbackFor = Exception.class)
        public String transactionNo1() {
            User user = new User();
            user.setName("小吾1号");
            user.setSex(1);
            userMapper.insert(user);
            System.out.println("没有异常事务不会触发,生成数据");
            return "新增成功,没有异常";
        }
    
        @Transactional(rollbackFor = Exception.class)
        public String transactionNo2() {
            User user = new User();
            user.setName("小吾2号");
            user.setSex(1);
            userMapper.insert(user);
            //这里我们给他出现一个异常使事务进行回滚
            int x = 2 / 0;
            //如果我们这里想要抛出自己的异常,可以使用try{}catch (){}抛出自定义异常信息
            System.out.println("这一段输出,就不会输出,直接执行事务回滚操作");
            return "新增失败,异常捕获,事务回滚";
        }
    
    }
    
    

    2、@Transactional简单介绍+使用方式

    1. @Transactional注解使用在接口实现类或者接口实现方法上,不能实现在接口类中
    2. @Transactional注解方法不能被其他方法间接调用,否则事务会失效
        /** 我们通过非事务方法调用事务方法,这时会导致事务失效 */
        public String transactionNo3() {
            return transactionalNo3();
        }
    
        /** 这里触发异常,小吾3号会直接新增,不会进行回滚 */
        @Transactional(rollbackFor = Exception.class)
        public String transactionalNo3(){
            User user = new User();
            user.setName("小吾3号");
            user.setSex(1);
            userMapper.insert(user);
            int x = 2 / 0;
            return "新增失败,异常捕获,事务回滚";
        }
    
    1. @Transactional注解只能使用在public方法上面,否则事务会失效。例:作用在private方法
        /**
         * 我们在控制层方法上使用private这时我们会发现事务失效,数据新增成功
         */
        @GetMapping("/transactionNo4")
        @Transactional(rollbackFor = Exception.class)
        private String transactionNo4(){
            System.out.println("测试事务是否回滚成功,方法4-非public方法使用事务");
            User user = new User();
            user.setName("小吾4号");
            user.setSex(1);
            userMapper.insert(user);
            //备注,我在控制层使用mapper接口是相当不符合代码规范的,这里只用于测试,勿怪
            int x = 2 / 0;
            return "方法4";
        }
    
    1. @Transactional注解对方法内线程方法无法作用到,线程出现异常也无法导致事务回滚
        @Transactional(rollbackFor = Exception.class)
        public String transactionNo5() {
            User user = new User();
            user.setName("小吾5号");
            user.setSex(1);
            userMapper.insert(user);
    
            Timer timer = new Timer();
            timer.schedule(
                    new TimerTask() {
                        @Override
                        public void run() {
                            System.out.println("hello");
                            //线程内部出现异常,并不会导致事务回滚
                            int x = 2/0;
                        }
                    },2000,4000
            );
            //同时线程外部异常也不会导致线程停止,但会使事务回滚
            int x = 2 / 0;
            return "事务与线程";
        }
    

    @Transactional注解 rollbackFor默认是捕获(RuntimeException)运行时异常类以及其子类的,当方法抛出(checked exception)编译时异常是不会进行捕获的,例如:IOException;需要捕获这类异常我们就要修改rollbackFor的作用范围。

    Transactional.png
    关于事务的介绍还有很多的不足,这里我们只做了一些简单的使用和介绍,后期会不定期更新。
    至此SpringBoot事务回滚简单使用就写完了,如有不懂可以加SpringBoot技术交流群14群号:719099151我是小吾,有问题可以直接在群里@我

    相关文章

      网友评论

        本文标题:SpringBoot + 事务回滚简单使用

        本文链接:https://www.haomeiwen.com/subject/rllvahtx.html