事务管理

什么是事务

事务是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败

操作顺序

  1. 开启事务(一组操作开始前,开启事务):start transaction / begin
  2. 提交事务(这组操作全部成功后,提交事务):commit
  3. 回滚事务(中间任何一个操作出现异常,回滚事务):rollback

Spring事务管理

  • 注解:@Transactional
  • 位置:业务(service)层的方法上、类上、接口上
  • 作用:将当前方法交给spring进行事务管理,方法执行前,开启事务,方法执行后,提交事务,出现异常,回滚事务
1
2
3
4
logging:
# 开启事务管理日志
level:
org.springframework.jdbc.support.jdbcTransactionManager: debug

rollbackFor

默认情况下,只有出现RuntimeException才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。

例子:

1
2
3
4
5
6
7
@Transactional(rollbackFor = Exception.class) //开启事务管理
@Override
public void delete(Integer id) {
deptMapper.deleteById(id); // 根据ID删除部门数据

empMapper.deleteByDeptId(id); // 根据部门ID删除该部门下的员工
}

propagation

事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
当事务A方法调用事务B方法时,A方法可以不启用事务,也可以启用事务,而B方法则必须启用事务。

  • REQUIRED:如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务。这是默认值。
  • REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则将当前事务挂起。
  • NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则将当前事务挂起。
  • NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
  • MANDATORY:如果当前存在事务,则加入该事务,如果当前没有事务,则抛出异常。
  • SUPPORTS:如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务方式运行。

传播行为表

Propagation Behavior Description
REQUIRED 如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务。这是默认值。
REQUIRES_NEW 创建一个新的事务,如果当前存在事务,则将当前事务挂起。
NOT_SUPPORTED 以非事务方式运行,如果当前存在事务,则将当前事务挂起。
NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。
MANDATORY 如果当前存在事务,则加入该事务,如果当前没有事务,则抛出异常。
SUPPORTS 如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务方式运行。

例子

在注解@Transactional中,propagation属性用于控制事务传播行为。

1
2
3
4
5
6
7
8
9
10
11
// 事务方法A
@Transactional
public void methodA() {
methodB(); // 调用事务方法B
}

// 事务方法B
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
// 业务逻辑
}