Spring中的事务管理

一、事务管理

1.事务回顾

  1. 概念
  • 事务是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败
  1. 操作
  • 开启事务(一组操作开始前,开启事务) : start transaction / begin ;
  • 提交事务(这组操作全部成功后,提交事务) : commit ;
  • 回滚事务(中间任何一个操作出现异常,回滚事务): rollback ;

2.Spring事务管理

1. 前言

  • 假如有一个公司,我们在做部门调整时删除一个部门,就要删除部门下的所有员工,否则会有造成数据的不一致。

2. 处理之后的代码

顺带加上一个根据部门id删除员工的功能:
  • Sevices代码:
@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

    @Autowired
    private EmpMapper empMapper;

    @Override
    public void delete(Integer id) {
        deptMapper.deleteId(id);  //根据id删除部门
        empMapper.deleteByDeptId(id);   ;  //根据部门id删除该部门下的员工
    }
}
  • Mapper层代码:
public interface EmpMapper {

    /**
     * 根据部门Id删除员工信息
     * @param deptId
     */
    @Delete("delete from emp where dept_id = #{deptId} ")
    void deleteByDeptId(Integer deptId);
}

上述代码段出现异常情况就会导致数据不一致–部门已经删除了,但是部门下的员工并未删除,就会造成数据的不一致。
此时可以使用Springboot事务管理注解``@Transactional`来处理。

3. Springboot事务管理–@Transactional注解

  • 位置:业务(service)层的方法上、上、接口
  • 作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务
    @Transactional  //交给Spring进行事务管窥
    @Override
    public void delete(Integer id) {
        deptMapper.deleteId(id);  //根据id删除部门
        empMapper.deleteByDeptId(id);   ;  //根据部门id删除该部门下的员工
    }

  • 开启Spring日志管理的开关(yml文件):
#spring事务管理日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

3.事务进阶

1.属性回滚rollbackFor

  • 默认情况下,只有出现RuntimeException才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。
	@Transactional (rollbackFor = Exception.class)  //设置此属性就会将所有的异常都会回滚(否则只会回滚RuntimeException此类异常)
    @Override
    public void delete(Integer id) {
        deptMapper.deleteId(id);  //根据id删除部门
        empMapper.deleteByDeptId(id);   ;  //根据部门id删除该部门下的员工
    }

2.属性传播行为propagation

  • 事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
属性值含义
REQUIRED【默认值】需要事务,有则加入,无则创建新事务
REQUIRES_NEW需要新事务,无论有无,总是创建新事务
SUPPORTS支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY必须有事务,否则抛异常
NEVER必须没事务,否则抛异常
······

REQUIRED∶:大部分情况下都是用该传播行为即可。
REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring事务管理方式有两种:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理是通过编写代码来手动管理事务的方式。在需要进行事务管理的方法,通过使用编程式事务管理的API,手动开启、提交或回滚事务。这种方式需要开发人员显式地编写事务管理的代码,对事务的控制更加细粒度,但也增加了代码的复杂性和维护成本。 2. 声明式事务管理: 声明式事务管理是通过配置的方式来实现事务管理。开发人员只需要在配置文件或注解声明哪些方法需要进行事务管理,而无需编写具体的事务管理代码。Spring框架会在运行时根据配置自动为这些方法添加事务管理的功能。声明式事务管理可以使用XML配置文件或基于注解的方式进行配置。 - 使用XML配置文件方式: 在XML配置文件,通过配置事务管理器(Transaction Manager)和切入点(Pointcut)来定义事务管理规则,然后将切入点和事务管理器进行关联。通过指定需要进行事务管理的方法,Spring框架会根据配置自动为这些方法添加事务管理功能。 - 使用注解方式: 在方法上使用@Transactional注解,该注解标识了需要进行事务管理的方法。Spring框架会根据注解配置自动为这些方法添加事务管理功能。 声明式事务管理相比于编程式事务管理,减少了开发人员的工作量,提高了代码的简洁性和可读性。同时,声明式事务管理还支持事务的传播行为、事务的隔离级别等高级特性的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曼诺尔雷迪亚兹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值