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的作用范围。

springboot下手动回滚 springboot数据库回滚_User


关于事务的介绍还有很多的不足,这里我们只做了一些简单的使用和介绍,后期会不定期更新。

至此SpringBoot事务回滚简单使用就写完了