一文读懂SpringBoot事务管理

0 前言

本文是介绍SpringBoot事务管理,阅读本文,你可以了解以下内容:

  1. 什么是SpringBoot事务,SpringBoot事务和数据库的事务有什么关联?
  2. 怎么使用SpringBoot事务?
  3. 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 Tr

你可能感兴趣的:(框架,spring,boot,后端,java)