SpringBoot事务不回滚的解决方案

yizhihongxing

针对SpringBoot事务不回滚的问题,我们可以通过以下几个步骤来进行解决:

1.确认事务正常工作

首先,我们需要确认事务的确不会自动回滚。可以在事务中对一个数据库表进行操作,然后将该操作后面的代码注释掉,确保事务提交的同时没有任何异常抛出,这样可以验证事务框架是否生效。

2.添加事务管理器

如果事务确实没有通过Spring事务管理器自动回滚,那么需要手动进行添加。在SpringBoot项目中添加事务的步骤如下:

2.1 添加事务管理器依赖

在项目的pom.xml文件中添加如下依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2.2 修改配置文件

在application.properties中添加以下配置信息:

#启用事务管理器
spring.datasource.platform=mysql
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

#开启事务的支持
spring.datasource.initialize=true
spring.datasource.continue-on-error=true
spring.datasource.rollback-on-commit-failure=true
spring.datasource.rollback-on-schema-error=true

#设置读写分离处理类
spring.datasource.initialize=true
spring.datasource.continue-on-error=true
spring.datasource.rollback-on-commit-failure=true
spring.datasource.rollback-on-schema-error=true

2.3 在代码中添加事务注解

在需要进行事务管理的方法上标注@Transactional注解,例如:

@Transactional
public void saveOrUpdate(User user){
   userDao.saveOrUpdate(user); //进行数据库写操作
   //doSomething()不会影响到事务,即使doSomething发生了异常,事务也能够自动回滚
   doSomething();
}

需要注意:@Transactional注解需要添加在public方法上(或调用该方法的public方法)、或加在实现了接口的方法上。

3.示例说明

假设我们有一个User表,用于保存用户的信息。当用户进行登录操作时,需要进行用户信息查询和密码校验,此时我们希望该操作具有事务特性,即如果查询或校验失败,则不保存用户登录信息,需要回滚事务。

示例1:添加回滚事务注解

以下面的代码为例,我们需要在saveLoginInfo()方法中添加@Transactional注解,以实现事务回滚:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Transactional
    public void saveLoginInfo(User user){
        // 查询该用户信息
        User queryUser = userDao.getUserByName(user.getName());
        // 如果查询结果为空或者密码不匹配
        if(queryUser == null || !queryUser.getPassword().equals(user.getPassword())){
            throw new IllegalArgumentException("用户名或密码错误!");
        }
        // 校验通过则保存用户信息
        userDao.saveOrUpdate(user);
    }
    // ...
}

在以上代码中,如果查询用户信息或者密码校验失败,则会抛出IllegalArgumentException异常,此时事务会自动回滚,不会保存用户登录信息。

示例2:手动回滚事务

还可以通过手动回滚事务的方式,来实现事务回滚的功能。例如:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private PlatformTransactionManager transactionManager;

    public void saveLoginInfo(User user){

        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(def);

        try {
            // 查询该用户信息
            User queryUser = userDao.getUserByName(user.getName());
            // 如果查询结果为空或者密码不匹配
            if(queryUser == null || !queryUser.getPassword().equals(user.getPassword())){
                throw new IllegalArgumentException("用户名或密码错误!");
            }
            // 校验通过则保存用户信息
            userDao.saveOrUpdate(user);
            transactionManager.commit(status);
        } catch (IllegalArgumentException e) {
            transactionManager.rollback(status);
        }
    }
    // ...
}

在以上代码中,我们首先使用PlatformTransactionManager获取到事务对象,然后在需要回滚的地方手动调用transactionManager.rollback(status)进行事务回滚,实现了事务的控制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot事务不回滚的解决方案 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • 使用MySQL MySqldump命令导出数据时的注意事项

    当使用MySQL MySqldump命令导出数据时,需要注意以下几点: 1. 确定导出的数据库 在使用MySqldump命令导出数据之前,你需要先确定要导出哪个数据库,可以使用以下命令查看所有数据库: show databases; 如果你需要导出名为example的数据库,可以使用以下命令: use example; 2. 确定导出的数据表 确定要导出的数…

    database 2023年5月21日
    00
  • Java中volatile关键字实现原理

    下面我将详细讲解“Java中volatile关键字实现原理”的完整攻略。 什么是volatile关键字 volatile是Java中的一个关键字,用来修饰变量。当一个变量被volatile修饰时,Java保证所有线程对该变量的写操作都立即同步到主存中,并且保证所有线程对该变量的读操作都从主存中读取值,而不是从线程的私有内存中。 volatile关键字实现原理…

    database 2023年5月21日
    00
  • mysql索引最左原则实例代码

    MySQL索引最左原则是指,在查询语句中,如果使用了多个字段作为条件,那么就需要针对这些条件建立相应的联合索引,且联合索引的顺序应当按照数据类型、数据长度等规则逐步递减的方式,放置在where条件语句的最左侧,这样才能保证索引的最优使用。 下面是两个示例说明: 示例1 假设我们有一个表t_student,其中包含了4个字段:sid (学生id)、name(学…

    database 2023年5月22日
    00
  • Python的Django框架中的select_related函数对QuerySet 查询的优化

    在Python的Django框架中,Django提供了select_related函数,可以对QuerySet查询进行优化,减少数据库查询次数,提升网站性能。接下来,我将为你详细讲解如何使用select_related函数,以及使用select_related函数的优势。 什么是select_related函数 select_related是Django框架…

    database 2023年5月22日
    00
  • Spring boot 添加Redis管理

    1.application.properties spring.redis-dev.database=1 spring.redis.host=172.16.50.107spring.redis.port=6379spring.redis.password=spring.redis.testOnBorrow=false # 连接池最大连接数(使用负值表示没有限…

    Redis 2023年4月12日
    00
  • oracle 函数

    什么是 Oracle 函数 Oracle 函数是一种用来封装可重复使用的SQL代码片段的方法。它向用户和应用程序提供了一种自定义的、可重用的函数库。 创建 Oracle 函数 可以使用以下语法来创建 Oracle 函数: CREATE [OR REPLACE] FUNCTION function_name [ (parameter_name [IN | OU…

    database 2023年5月21日
    00
  • mybatis 查询sql中in条件用法详解(foreach)

    下面是mybatis中查询sql中in条件用法详解(foreach)的完整攻略。 1. 前言 在mybatis中,查询sql中经常需要使用到in条件,例如查询一个列表中某些id所对应的信息。mybatis提供了使用foreach标签来实现in条件的查询。 2. 使用foreach标签的in条件查询 下面介绍foreach标签在in条件查询中的用法: 2.1 …

    database 2023年5月21日
    00
  • CentOS+Nginx+PHP+MySQL详细配置(图解)

    以下是详细讲解 CentOS+Nginx+PHP+MySQL 的完整配置攻略,包含示例说明。 环境说明 操作系统:CentOS 7 Web 服务器:Nginx PHP 版本:7.2 数据库服务:MySQL 步骤一:安装必要的软件 首先,我们需要安装必要的软件,包括安装 Nginx、PHP 和 MySQL。 安装 Nginx 使用以下命令安装 Nginx: $…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部