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日

相关文章

  • python操作MySQL 模拟简单银行转账操作

    下面是完整攻略: 前言 在Python应用的常见开发场景中,与数据库的交互是非常常见的。而在数据库中,MySQL是应用最广泛的一种关系型数据库之一。因此,学习Python操作MySQL是非常必要的一种技能。 本文中,将介绍如何使用Python操作MySQL,模拟简单银行转账操作的完整攻略。在此操作中,将可以学习到如何使用Python与MySQL进行连接、创建…

    database 2023年5月22日
    00
  • PHP实现负载均衡session共享redis缓存操作示例

    我来详细讲解一下“PHP实现负载均衡session共享redis缓存操作示例”的完整攻略。 什么是负载均衡以及为什么要使用Redis缓存操作? 负载均衡是指将工作任务分配给多个计算机或其他资源,以达到更高的性能、更好的可扩展性和更高的可用性。在Web应用程序中,负载均衡是确保应用程序可以处理高流量时保持稳定和可靠的关键。 当我们的Web应用程序在多个服务器上…

    database 2023年5月22日
    00
  • MySQL之数据表的插入内容 空与非空(六)

    NULL与NOT NULL mysql> CREATE TABLE tb2( -> usename VARCHAR(20) NOT NULL, -> age TINYINT UNSIGNED NULL(可以为空) -> );Query OK, 0 rows affected (0.06 sec) mysql> SHOW COLU…

    MySQL 2023年4月16日
    00
  • MySQL的主从复制步骤详解及常见错误解决方法

    MySQL主从复制是将一台MySQL服务器的数据同步到另一台MySQL服务器上,以实现高可用和负载均衡。下面是MySQL主从复制的详细步骤及其常见错误解决方法。 步骤一:配置主库 修改 my.cnf 文件,启用二进制日志和自动增量 ID(binlog 和 auto_increment_offset)。 [mysqld] log-bin=mysql-bin s…

    database 2023年5月18日
    00
  • DBMS 数据模型

    DBMS 数据模型是指数据库所使用的数据结构和约束条件的集合。数据模型可以帮助我们理解实体之间的关系,以及如何操作和管理数据库。下面,我们将详细讲解DBMS 数据模型的完整攻略,并给出一些实例说明。 1. 关系数据模型 关系数据模型是一种用来表示数据的方式,它使用表格(即关系)来表示数据,其中每个表格都有一个唯一的标识符,称为主键。表格之间的关系可以通过外键…

    database 2023年3月27日
    00
  • MYSQL的存储过程和函数简单写法

    MySQL是一款常用的关系型数据库管理系统,支持存储过程和函数的编写。这里将详细讲解MySQL的存储过程和函数的简单写法,并提供几个示例说明。 存储过程的简单写法 在MySQL中,存储过程就是一个SQL语句集合,可以理解为一种特殊的函数。使用存储过程可以减少重复的SQL语句,提高代码的复用性和执行效率。以下是MySQL存储过程的简单写法: CREATE PR…

    database 2023年5月22日
    00
  • JavaWeb三大组件之一的Filter详解

    JavaWeb三大组件之一的Filter详解 Filter是JavaWeb三大组件之一,它的作用是过滤请求并对请求做出必要的处理,例如,对于某些请求需要进行权限验证、日志记录等处理,这个时候Filter就可以派上用场了。本文将详细讲解Filter的使用方式和常用的应用场景。 一、Filter的使用方式 1.1 定义Filter类 可以通过实现javax.se…

    database 2023年5月22日
    00
  • ecmall二次开发 直接实例化mysql对象

    $db = &db(); // 第一步赋值数据库类库, $db->query(sql); // 第二步执行mysql 语句; 常用的数据库函数: 得到一行数据 $user=$db->getrow(“select * from ecm_member where user_id=111”); print_r($user); 得到一列数据 $u…

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