事务管理

概念:**事务是一组操作的集合,它是一个不可分割**的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

注意:默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务

操作:事务控制主要三步操作:开启事务、提交事务/回滚事务(同时成功/一个失败)

在MySQL中手动开启事务:

1
2
3
4
5
6
7
8
9
10
11
-- 开启事务
start transaction; / begin;

-- 1. 第一条SQL语句
INSERT INTO ...;
-- 2. 第二条SQL语句
INSERT INTO ...;
-- ... 第n条 ...

-- 提交事务(全部成功) / 回滚事务(一个失败)
commit; / rollback;

事务控制

由于事务管理在项目开发中使用的频率很高,所以Spring对其进行了封装:

  • 注解:@Transactional
  • 作用:将当前方法交给Spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务
  • 位置:业务(Service)层的方法上、类上、接口上,推荐放在方法上(并不是所有方法、所有类都需要事务控制)
  • 场景:当某个方法中存在操作多次数据库时,就可以考虑使用事务控制
  • 查看Spring事务管理的底层日志:
1
2
3
4
# 在配置文件中,配置日志信息,查看Spring事务管理的底层日志
logging:
level:
org.springframework.jdbc.support.JdbcTransactionManager: debug

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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属性用于控制出现何种异常类型,回滚事务
  • 示例:
1
@Transactional(rollbackFor = {Exception.class})

在默认情况下,Transactional只有出现了RuntimeException运行时异常,才会进行回滚

rollbackFor的参数是数组形式的,可以指定多个异常,或者直接指定所有异常(Exception)

propagation

  • 事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制
1
2
3
4
5
6
7
8
9
10
11
@Transactional
public void a() {
// ...
userService.b();
// ...
}

@Transactional
public void b() {
// ...
}
属性值 含义
REQUIRED 【默认值】需要事务,有则加入,无则创建新事务
REQUIRES_NEW 需要新事务,无论有无,总是创建新事务
SUPPORTS 支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY 必须有事务,否则抛异常
NEVER 必须没事务,否则抛异常
. . .

主要关注前两个属性,使用频率相对较多:

  1. REQUIRED:如果事务方法b没有指定事务传播行为(也就是采用默认属性REQUIRED),那么事务方法b就会加入到事务方法a中,且方法a和方法b被看作是一个整体事务
  2. REQUIRES_NEW:和REQUIRED属性的区别在于,事务方法b不会加入到事务方法a中,而是单独创建一个新的事务,也就是说此时存在两个独立的事务,事务A和事务B

注意:propagation属性添加到**被调用事务方法**的 @Transactional注解中

四大特性(ACID)

  • 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
  • 隔离性(Isolution):数据库系统提供的隔离机制,保证事务在不受外部并发影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是**永久**的