Spring中的事务管理

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、事务管理

1.事务回顾

  1. 概念
  • 事务是一组操作的集合它是一个不可分割的工作单位这些操作要么同时成功要么同时失败
  1. 操作
  • 开启事务一组操作开始前开启事务) : start transaction / begin ;
  • 提交事务这组操作全部成功后提交事务) : commit ;
  • 回滚事务中间任何一个操作出现异常回滚事务): rollback ;

2.Spring事务管理

1. 前言

  • 假如有一个公司我们在做部门调整时删除一个部门就要删除部门下的所有员工否则会有造成数据的不一致。

2. 处理之后的代码

顺带加上一个根据部门id删除员工的功能
  • Sevices代码
@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private EmpMapper empMapper;

    @Override
    public void delete(Integer id) {
        deptMapper.deleteId(id);  //根据id删除部门
        empMapper.deleteByDeptId(id);   ;  //根据部门id删除该部门下的员工
    }
}
  • Mapper层代码
public interface EmpMapper {

    /**
     * 根据部门Id删除员工信息
     * @param deptId
     */
    @Delete("delete from emp where dept_id = #{deptId} ")
    void deleteByDeptId(Integer deptId);
}

上述代码段出现异常情况就会导致数据不一致–部门已经删除了但是部门下的员工并未删除就会造成数据的不一致。
此时可以使用Springboot事务管理注解``@Transactional`来处理。

3. Springboot事务管理–@Transactional注解

  • 位置:业务(service层的方法上、上、接口
  • 作用:将当前方法交给spring进行事务管理方法执行前开启事务;成功执行完毕提交事务;出现异常回滚事务
    @Transactional  //交给Spring进行事务管窥
    @Override
    public void delete(Integer id) {
        deptMapper.deleteId(id);  //根据id删除部门
        empMapper.deleteByDeptId(id);   ;  //根据部门id删除该部门下的员工
    }

  • 开启Spring日志管理的开关(yml文件)
#spring事务管理日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

3.事务进阶

1.属性回滚rollbackFor

  • 默认情况下只有出现RuntimeException才回滚异常。rollbackFor属性用于控制出现何种异常类型回滚事务。
	@Transactional (rollbackFor = Exception.class)  //设置此属性就会将所有的异常都会回滚否则只会回滚RuntimeException此类异常
    @Override
    public void delete(Integer id) {
        deptMapper.deleteId(id);  //根据id删除部门
        empMapper.deleteByDeptId(id);   ;  //根据部门id删除该部门下的员工
    }

2.属性传播行为propagation

  • 事务传播行为:指的就是当一个事务方法被另一个事务方法调用时这个事务方法应该如何进行事务控制。
属性值含义
REQUIRED【默认值】需要事务有则加入无则创建新事务
REQUIRES_NEW需要新事务无论有无总是创建新事务
SUPPORTS支持事务有则加入,无则在无事务状态中运行
NOT_SUPPORTED不支持事务在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY必须有事务否则抛异常
NEVER必须没事务否则抛异常
······

REQUIRED∶:大部分情况下都是用该传播行为即可。
REQUIRES_NEW:当我们不希望事务之间相互影响时可以使用该传播行为。比如:下订单前需要记录日志不论订单保存成功与否都需要保证日志记录能够记录成功。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring