事务管理

事务管理

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

事务的操作

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

@Transactional事务管理注解

  • 位置:业务(service)层的方法上、类上、接口上
  • 作用:将当前方法交给spring进行事务管理,方法执行前,开启事务:成功执行完毕,提交事务:出现异常,回滚事务
public class UserServiceImpl implements UserService {
    //根据id删除部门数据
    @Override
    @Transactional //当前方法已经交给spring进行事务管理
    public void deleteDeptById(Integer id) {
        //删除部门数据
        deptMapper.deleteDeptById(id);
        //删除部门下的员工
        //查找该部门下的员工
        List<Emp> empByDeptIdList = empMapper.findEmpByDeptId(id);
        //删除该部门下的所有
        empByDeptIdList.stream().map(Emp::getId).forEach(empMapper::deleteEmpById);
    }
}

spring 事务管理日志开关

# spring 事务管理日志开关
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

@Transactional注解中的属性

rollbackFor属性

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

public class UserServiceImpl implements UserService {
    //根据id删除部门数据
    @Override
    //当前方法已经交给spring进行事务管理
    //rollbackFor = Exception.class 表示出现所有异常都回滚
    @Transactional(rollbackFor = Exception.class)
    public void deleteDeptById(Integer id) {
        throw new Exception("测试事务回滚");
       ----
    }
}

propagation属性

  • propagation属性用于设置事务传播行为
  • 指的是当一个事物方法被另一个事务方法调用时,这个方法应该如何进行事务控制

属性值

属性值含义
REQUIRED 默认如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
REQUIRES_NEW创建一个新的事务,如果当前存在事务,则把当前事务挂起

场景

  • REOUIRED:大部分情况下都是用该传播行为即可。
  • REQUIRES NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与公否,都需要保证日志记录能够记录成功。
上次更新 2025/3/13 17:31:09