0 前言
本文是介绍SpringBoot事务管理,阅读本文,你可以了解以下内容:
- 什么是SpringBoot事务,SpringBoot事务和数据库的事务有什么关联?
- 怎么使用SpringBoot事务?
- SpringBoot的实现原理是什么?
1 SpingBoot事务简介
什么是事务?
事务是指系统进行一系列操作,一旦其中有一个操作失败,都将全部回滚,满足ACID(原子性、一致性、隔离性、持久性)特性,Mysql中Innnodb也使用了事务的概念。
什么是SpringBoot事务
SpringBoot事务是指程序执行的过程中,通过代理的方式,将程序的多个业务逻辑/对数据库的多次操作包裹成一个事务,避免部分程序对数据库操作成功导致的数据不一致问题。
2 SpringBoot使用事务
SpringBoot事务可以采用编程式事务和声明式事务,编程式事务是通过编码方式实现事务,声明式事务基于AOP将具体业务逻辑与事务处理解耦,也是目前的主要操作。
2.1 @Transaction 注解使用
声明式事务一般采用@Transcation注解的方式进行开启,@Transcation注解使用非常简单,直接在方法上使用注解即可。
@Transactional(rollbackFor = RuntimeException.class)
public void test(Long id){
removeById(id);
User user = getUser();
save(user);
}
@Transcation注解属性介绍
propagation(传播)事务传播行为,可选值如下:
- REQUIRED(默认值):如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
- SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式继续运行。
- MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
- REQUIRES_NEW:重新创建一个新的事务,如果当前存在事务,暂停当前的事务。
- NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事务。
- NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。
- NESTED:和 REQUIRED 效果一样。
isolation(隔离)事务隔离级别,可选择如下:
- DEFAULT(默认值):使用底层数据库默认的隔离级别。
- READ_UNCOMMITTED:未提交读。无法防止。
- READ_COMMITTED:可提交读。可以防止脏读。
- REPEATABLE_READ:可重复读。可以防止脏读、可重复读。mysql 默认隔离级别。
- SERIALIZABLE:串行事务。最高事务隔离级别,可以防止脏读、可重复读、幻读。
**rollbackFor **触发回滚异常
默认配置下Spring只会回滚运行时异常或Error,如果想方法中碰到指定异常才回滚可以使用@Transactional(rollbackFor=Exception.class)、@Transactional(rollbackFor=SQLException.class) 等
**noRollbackFor **不回滚异常
如果想方法中发生某些运行时异常不回滚,则可以通过 noRollbackFor 属性指定,如:@Transactional(notRollbackFor=RunTimeException.class),
2.2 全局事务配置
可以使用全局事务配置,避免每次都需要使用注解@Transcation,只需要约定好数据库增删查改的命名规范,示例代码如下,你只需要调整attributesMap里面的参数即可。
/**
* @Author asxy
* @Version 1.0
* @Date 2023/8/17
*/
@Aspect
@Configuration
public class TransactionalAopConfig {
/**
* 配置方法过期时间,单位毫秒
*/
private final static int