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日

相关文章

  • linux 后台运行node服务指令方法

    要在Linux系统中后台运行node服务,需要用到以下两个重要的指令: nohup:nohup命令可以在程序后台运行,并且把程序的输出重定向到nohup.out文件中,防止进程被终止。 &:在Linux终端中,如果在命令后面添加 &,那么该命令将在后台运行。 下面是具体的步骤: 打开终端并进入工作目录。 输入以下指令,用于后台运行node服务…

    database 2023年5月22日
    00
  • 简单讲解MySQL的数据库复制方法

    MySQL是一种开源关系型数据库管理系统,它的数据库复制功能可以将一个MySQL实例的数据拷贝到另外一个服务器实例上,从而对数据进行备份和灾备。 以下是MySQL数据库复制的方法: 主从复制 主从复制是MySQL中最常用的一种复制方式。它通过将一个MySQL服务器实例作为主服务器,将这个主服务器上的所有操作都复制到多个从服务器上的方式,来实现数据同步。 实现…

    database 2023年5月18日
    00
  • linux下自动备份MySQL数据并上传到FTP上的shell脚本

    下面是详细的攻略: 1. 确定备份方式 在linux下备份MySQL数据,并上传到FTP上,一般有两种途径: 1.1. mysqldump备份 该方法是最常见的备份MySQL数据的方法,可以将MySQL的表结构和数据导出为一个.sql文件。通过该方法备份MySQL数据的示例代码如下: #!/bin/bash # 备份的数据库名 db_name="m…

    database 2023年5月22日
    00
  • linux skill命令参数及用法详解(linux中断进程执行命令)

    Linux Skill命令参数及用法详解 简介 Skill命令的全称是Signal Kill的简称,意为发送进程信号以终止进程的执行。在Linux操作系统中,进程可能由于某些原因导致无法正常退出,此时就需要使用Skill命令强制终止进程。 命令语法 skill [options] [ -u user ] [ -o ] [ -v ] [ -n ] [ -c c…

    database 2023年5月22日
    00
  • Centos6.7 Redis3.2.8的主从搭建

    首先参看一下redis 3.2.8的安装 传送门:biubiubiu 飞去吧:http://www.cnblogs.com/bing-yu12/p/6582086.html 我的主从搭建:   redis 主环境:     centos 6.7      ip:192.168.184.3     redis 3.2.8     redis.conf的重要配置…

    Redis 2023年4月13日
    00
  • 如何使用Python从CSV文件中导入数据到数据库?

    要使用Python将CSV文件中的数据导入到数据库中,可以使用Python的内置模块csv和第三方库pandas。以下是使用这两种方法将CSV文件中的数据导入到数据库的完整攻略: 使用csv模块 csv模块将CSV文件中的导到数据库中,需要先连接到数据库,然后使用csv.reader()方法读取CSV文件中的数据,并使用SQL语句将数据插入到数据库中以下是一…

    python 2023年5月12日
    00
  • Trafodion和Virtuoso的区别

    Trafodion和Virtuoso都是数据库管理系统,但它们有很大的不同之处。 Trafodion是一个基于Apache Hadoop的开源的分布式SQL数据库管理系统。它支持传统的SQL语言和事务处理,并提供了对大规模数据的分布式查询和数据仓库功能的支持。Trafodion可以与Hadoop、Spark和其他Hadoop生态系统工具集成,支持多种数据类型…

    database 2023年3月27日
    00
  • SQL Server 2005 定时执行SQL语句的方法

    SQL Server 2005可以使用SQL Server代理(Agent)来定时执行SQL语句。下面是具体步骤: 步骤一:启动SQL Server代理服务 要执行这个步骤,需要确保已经拥有管理员权限。 打开SQL Server Management Studio。 在“对象资源管理器”中,右键单击“SQL Server代理”。 选择“启动”。 如果“SQL…

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