Spring 事务管理
事务管理
概念:**事务是一组操作的集合,它是一个不可分割**的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
注意:默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务
操作:事务控制主要三步操作:开启事务、提交事务/回滚事务(同时成功/一个失败)
在MySQL中手动开启事务:
-- 开启事务
start transaction; / begin;
-- 1. 第一条SQL语句
INSERT INTO ...;
-- 2. 第二条SQL语句
INSERT INTO ...;
-- ... 第n条 ...
-- 提交事务(全部成功) / 回滚事务(一个失败)
commit; / rollback;
事务控制
由于事务管理在项目开发中使用的频率很高,所以Spring对其进行了封装:
- 注解:@Transactional
- 作用:将当前方法交给Spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务
- 位置:业务(Service)层的方法上、类上、接口上,推荐放在方法上(并不是所有方法、所有类都需要事务控制)
- 场景:当某个方法中存在操作多次数据库时,就可以考虑使用事务控制
- 查看Spring事务管理的底层日志:
# 在配置文件中,配置日志信息,查看Spring事务管理的底层日志
logging:
level:
org.springframework.jdbc.support.JdbcTransactionManager: debug
示例:
@Override
@Transactional
public void save(Emp emp) {
// 保存员工基本信息
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.saveBasicInfo(emp);
// 保存员工经历
List<EmpExpr> exprList = emp.getExprList();
if (!CollectionUtils.isEmpty(exprList)) {
// 返回给emp对象后,需要对集合遍历,将emp中的id赋值给集合中的每个EmpExpr对象下的empId
exprList.forEach(item -> item.setEmpId(emp.getId()));
empExprMapper.saveExprInfo(exprList);
}
}
rollbackFor
- rollbackFor属性用于控制出现何种异常类型,回滚事务
- 示例:
@Transactional(rollbackFor = {Exception.class})
在默认情况下,Transactional只有出现了RuntimeException运行时异常,才会进行回滚
rollbackFor的参数是数组形式的,可以指定多个异常,或者直接指定所有异常(Exception)
propagation
- 事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制
@Transactional
public void a() {
// ...
userService.b();
// ...
}
@Transactional
public void b() {
// ...
}
| 属性值 | 含义 |
|---|---|
| REQUIRED | 【默认值】需要事务,有则加入,无则创建新事务 |
| REQUIRES_NEW | 需要新事务,无论有无,总是创建新事务 |
| SUPPORTS | 支持事务,有则加入,无则在无事务状态中运行 |
| NOT_SUPPORTED | 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务 |
| MANDATORY | 必须有事务,否则抛异常 |
| NEVER | 必须没事务,否则抛异常 |
| . . . |
主要关注前两个属性,使用频率相对较多:
- REQUIRED:如果事务方法b没有指定事务传播行为(也就是采用默认属性REQUIRED),那么事务方法b就会加入到事务方法a中,且方法a和方法b被看作是一个整体事务
- REQUIRES_NEW:和REQUIRED属性的区别在于,事务方法b不会加入到事务方法a中,而是单独创建一个新的事务,也就是说此时存在两个独立的事务,事务A和事务B
注意:
propagation属性添加到**被调用事务方法**的@Transactional注解中
四大特性(ACID)
- 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
- 隔离性(Isolution):数据库系统提供的隔离机制,保证事务在不受外部并发影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是**永久**的
许可协议:
CC BY 4.0