Spring中的事务管理

一、事务管理

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:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。

你可能感兴趣的:(后端,java,mybatis,spring)