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