Spring 事务管理

发布时间 2023-07-23 13:14:00作者: 菠菜好不好吃

事务

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

操作

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

一、Spring 事务管理

当涉及多表连接的时候,需要用到@Transaction,一般情况下用在方法中

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

// 方法
@Transactional
@Override
public void delete(Integer id) {
	deptMapper.deleteById(id);
	int i = 1 / 0; // 模拟抛出异常
	empMapper.deleteById(id);
}

// 接口
@Transactional
public interface DeptService {}

// 类
@Service
public class DeptServiceImpl implements DeptService {}

在spring框架当中就已经把事务控制的代码都已经封装好了,并不需要我们手动实现。我们使用了spring框架,我们只需要通过一个简单的注解@Transactional就搞定了。

Transactional 注解

@Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。

@Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在一个事务范围内。

二、事务进阶

1. 事务属性-回滚 RollbackFor

  • 默认情况下,只有出现RuntimeException才会回滚异常。rollbackFor属性用于控制出现任何异常类型,回滚事务
@Transactional(rollbackFor = Exception.class) // 出现所有异常,进行事务回滚(Exception.class 可修改)
@Override
public void delete(Integer id) throws Exception {
	deptMapper.deleteById(id);
	if(true) {
		throw new Exception("出错....");
	}
	empMapper.deleteById(id);
}

2. 事务属性-传播行为 Propagation

事务传播行为:指的是当一个事务方法被另一个事务调用时,这个事务方法应该如何进行事务控制

@Transactional
public void a() {
	// ...
	userservice.b();
	// ...
}
@Transactional(propagetion = Propagation.REQUIRED) // 若有事务,则加入事务,若无则创建新事物(默认情况,定不定义都默认)
public void b() {
	// ...
}
  • REQUIRED:大部分情况下都是用该传播行为
  • REQUIRES_NEW:当我们不希望事物之间相互影响时,考研使用该传播行为。比如:下订单前需要记录日志,无论订单保存成功与否,都需要保证日志记录成功