乐趣区

关于java:Spring事务管理

1.1. 什么是事务?

事务 是一组操作的汇合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作申请。所以这组操作要么同时胜利,要么同时失败。

事务的操作次要有三步:

  1. 开启事务(一组操作开始前,开启事务):start transaction / begin ;
  2. 提交事务(这组操作全副胜利后,提交事务):commit ;
  3. 回滚事务(两头任何一个操作出现异常,回滚事务):rollback ;

1.2 Spring 事务管理

1.2.1 案例

需要:当部门遣散了不仅须要把部门信息删除了,还须要把该部门下的员工数据也删除了。

步骤:

  • 依据 ID 删除部门数据
  • 依据部门 ID 删除该部门下的员工

代码实现:

  1. DeptServiceImpl
@Slf4j
@Service
public class DeptServiceImpl implements DeptService {
    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private EmpMapper empMapper;


    // 依据部门 id,删除部门信息及部门下的所有员工
    @Override
    public void delete(Integer id){
        // 依据部门 id 删除部门信息
        deptMapper.deleteById(id);

        // 删除部门下的所有员工信息
        empMapper.deleteByDeptId(id);   
    }
}
  1. DeptMapper
@Mapper
public interface DeptMapper {
    /**
     * 依据 id 删除部门信息
     * @param id   部门 id
     */
    @Delete("delete from dept where id = #{id}")
    void deleteById(Integer id);
}
  1. EmpMapper
@Mapper
public interface EmpMapper {

    // 依据部门 id 删除部门下所有员工
    @Delete("delete from emp where dept_id=#{deptId}")
    public int deleteByDeptId(Integer deptId);
    
}

在办法运行之前,开启事务,如果办法胜利执行,就提交事务,如果办法执行的过程当中出现异常了,就回滚事务。

所以在 spring 框架当中就曾经把事务管制的代码都曾经封装好了,并不需要咱们手动实现。咱们应用了 spring 框架,咱们只须要通过一个简略的注解 @Transactional 就搞定了。

1.2.3 Transactional 注解

@Transactional 作用:就是在以后这个办法执行开始之前来开启事务,办法执行结束之后提交事务。如果在这个办法执行的过程当中呈现了异样,就会进行事务的回滚操作。

@Transactional 注解:咱们个别会在业务层当中来管制事务,因为在业务层当中,一个业务性能可能会蕴含多个数据拜访的操作。在业务层来管制事务,咱们就能够将多个数据拜访操作控制在一个事务范畴内。

@Transactional 注解书写地位:

  • 办法

    • 以后办法交给 spring 进行事务管理
    • 以后类中所有的办法都交由 spring 进行事务管理
  • 接口

    • 接口下所有的实现类当中所有的办法都交给 spring 进行事务管理

接下来,咱们就能够在业务办法 delete 上加上 @Transactional 来管制事务。

@Slf4j
@Service
public class DeptServiceImpl implements DeptService {
    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private EmpMapper empMapper;

    
    @Override
    @Transactional  // 以后办法增加了事务管理
    public void delete(Integer id){
        // 依据部门 id 删除部门信息
        deptMapper.deleteById(id);
        
        // 模仿:异样产生
        int i = 1/0;

        // 删除部门下的所有员工信息
        empMapper.deleteByDeptId(id);   
    }
}

1.3 事务进阶

后面咱们通过 spring 事务管理注解 @Transactional 曾经管制了业务层办法的事务。接下来咱们要来具体的介绍一下 @Transactional 事务管理注解的应用细节。咱们这里次要介绍 @Transactional 注解当中的两个常见的属性:

  1. 异样回滚的属性:rollbackFor
  2. 事务流传行为:propagation

1.3.1 rollbackFor

咱们在之前编写的业务办法上增加了 @Transactional 注解,来实现事务管理。

@Transactional
public void delete(Integer id){
        // 依据部门 id 删除部门信息
        deptMapper.deleteById(id);
        
        // 模仿:异样产生
        int i = 1/0;

        // 删除部门下的所有员工信息
        empMapper.deleteByDeptId(id);   
}

以上业务性能 delete()办法在运行时,会引发除 0 的算数运算异样(运行时异样),出现异常之后,因为咱们在办法上加了 @Transactional 注解进行事务管理,所以产生异样会执行 rollback 回滚操作,从而保障事务操作前后数据是统一的。

如果咱们想让所有的异样都回滚,须要来配置 @Transactional 注解当中的 rollbackFor 属性,通过 rollbackFor 这个属性能够指定呈现何种异样类型回滚事务。

@Slf4j
@Service
public class DeptServiceImpl implements DeptService {
    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private EmpMapper empMapper;

    
    @Override
    @Transactional(rollbackFor=Exception.class)
    public void delete(Integer id){
        // 依据部门 id 删除部门信息
        deptMapper.deleteById(id);
        
        // 模仿:异样产生
        int num = id/0;

        // 删除部门下的所有员工信息
        empMapper.deleteByDeptId(id);   
    }
}

论断:

  • 在 Spring 的事务管理中,默认只有运行时异样 RuntimeException 才会回滚。
  • 如果还须要回滚指定类型的异样,能够通过 rollbackFor 属性来指定。
退出移动版