SpringBoot事务不回滚的解决方案

针对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日

相关文章

  • MyBatisPlus 大数据量查询慢的问题解决

    长时间的 SQL 执行和慢查询经常是面对大量数据时的问题。在使用 MyBatisPlus 进行大数据量的查询时,也会遇到这样的问题。下面详细讲解如何解决这些问题。 问题背景 在使用 MyBatisPlus 进行大数据量的查询时,由于返回的数据较多,可能会导致 SQL 执行时间较长,甚至会出现慢查询的情况。下面列举几个可能会导致查询缓慢的因素: 数据库存储介质…

    database 2023年5月21日
    00
  • 详解docker搭建redis集群的环境搭建

    详解docker搭建redis集群的环境搭建 Docker是一个强大的容器化平台,可以方便地部署各种应用程序,包括Redis集群。在本教程中,我们将详细介绍如何使用Docker搭建Redis集群的环境。 步骤一:安装Docker和Docker Compose 在开始之前,您需要先安装Docker和Docker Compose。如果您还没有安装这些工具,请先参…

    database 2023年5月22日
    00
  • 如何使用Python实现数据库中数据的全文检索?

    以下是使用Python实现数据库中数据的全文检索的完整攻略。 数据库中数据的全文检索简介 在数据库中,全文检索是指根据关键字检索查询。在Python中,可以使用pymysql连接到MySQL数据库,并使用SELECT语句实现全文检索。 步骤1:连接数据库 在Python中,可以使用pymysql连接MySQL数据库。以下是连接到MySQL的基本语法: imp…

    python 2023年5月12日
    00
  • Firebase和Impala的区别

    Firebase是一种由Google开发的云端后端服务,提供了一整套完整的工具和服务,用于帮助开发者构建和扩展基于移动和Web的应用程序。它提供了包括实时数据库、云存储、身份验证和消息传递等开发者所需的服务,并提供了易用的UI使开发者可以更加高效的完成应用程序的构建工作。 相比之下,Impala则是一种高效的分布式SQL查询引擎,是Apache Hadoop…

    database 2023年3月27日
    00
  • oracle select执行顺序的详解

    我为你讲解“oracle select执行顺序的详解”的完整攻略。 概述 Oracle数据库中SELECT语句的执行顺序经常让人困惑,下面详细介绍一下SELECT语句的执行过程。 SELECT语句执行顺序 一个SELECT语句的执行过程可以分为以下几个步骤: FROM子句 WHERE子句 GROUP BY子句 HAVING子句 SELECT子句 ORDER …

    database 2023年5月21日
    00
  • 利用PHP访问带有密码的Redis方法示例

    关于“利用PHP访问带有密码的Redis方法示例”的完整攻略,以下是一些步骤和示例说明: 1. 安装 PHP Redis 扩展 要使用 PHP 操作 Redis,需要先安装 Redis 扩展。以 Ubuntu 为例,可以在终端中输入以下命令进行安装: sudo apt-get update sudo apt-get install php-redis 安装完…

    database 2023年5月22日
    00
  • 如何在Python中删除PostgreSQL数据库中的数据?

    以下是在Python中删除PostgreSQL数据库中的数据的完整使用攻略。 使用PostgreSQL数据库的前提条件 在使用Python连接PostgreSQL数据库之前,确保已经安装了PostgreSQL数据库,并已经创建使用数据库和表,同时需要安装Python的动程序,例如psycopg2。 步骤1:导入模块 在Python中使用psycopg2模块连…

    python 2023年5月12日
    00
  • MYSQL安装配置文件my-small.ini、my-medium.ini、my-large.ini、my-huge.ini文件的作用 my-small.ini、my-medium.ini、my-large.ini、my-huge.ini文件的作用

      安装完mysql之后或者是下载的免安装版解压之后,默认是没有my.ini文件的.但是,有几个类似的文件,如my-small.ini、my-medium.ini、my-large.ini、my-huge.ini。这几个文件是mysql针对不同的应用推荐的不同的配置信息;但这些配置只有放到my.ini中才会被应用。其中:1、my-small.ini是为了小型…

    MySQL 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部