关于Spring的@Transaction导致数据库回滚全部生效问题(又删库跑路)

关于Spring的事务管理,如果使用默认配置会导致数据库中的数据出现异常时,整个事务会被回滚,包括正常执行的数据也会被回滚,这种情况下可能会造成严重的数据丢失。以下是我总结出的关于这个问题的完整攻略:

问题分析

在 Spring 中,默认情况下,使用 @Transactional 注解添加的事务会使用最悲观的隔离级别(TransactionDefinition.ISOLATION_DEFAULT),设置了自动回滚(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)。

解决方案

方案一:只回滚异常的操作

不是所有的操作都需要回滚,有些操作可以继续进行。我们可以通过标记异常来决定是否回滚事务。我们可以通过设置 @Transactional 注解的 rollbackFor 属性,来指示需要回滚的异常:

@Service
public class MyService {
    @Transactional(rollbackFor = MyException.class)
    public void func() throws MyException {
        // some code
    }
}

在这个例子中,如果抛出了 MyException 异常,就会回滚当前事务。

方案二:多事务管理器来管理数据源

使用多个事务管理器来分别管理不同的数据源,这样就能保证每个数据源独立进行事务管理。以下是一个使用多个事务管理器的示例:

@Configuration
public class DataSourceConfiguration {
    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public PlatformTransactionManager primaryTransactionManager() {
        return new DataSourceTransactionManager(primaryDataSource());
    }

    @Bean
    public PlatformTransactionManager secondaryTransactionManager() {
        return new DataSourceTransactionManager(secondaryDataSource());
    }
}

在这个例子中,我们使用了两个数据源,每个数据源都有自己的事务管理器。这样做可以保证每个数据源在事务管理时是独立的。

总结

以上是关于 Spring 的 @Transactional 导致数据库回滚全部生效问题的完整攻略。我们可以通过设置 rollbackFor 属性或者使用多个事务管理器来解决这个问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Spring的@Transaction导致数据库回滚全部生效问题(又删库跑路) - Python技术站

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

相关文章

  • redis数据的两种持久化方式对比

    让我来详细讲解一下“redis数据的两种持久化方式对比”的完整攻略。 持久化 在Redis中,持久化有两种方式: RDB:在指定的时间间隔内,将内存中的数据集快照写入磁盘,也就是快照持久化。快照持久化可以将数据存储到非易失性存储介质中,比如磁盘中,可以保证数据不会丢失。 AOF:在指定的时间间隔内,将执行的所有写操作以追加的形式写入文件,也就是追加持久化。追…

    database 2023年5月22日
    00
  • 如何在Python中执行Microsoft SQL Server数据库的查询语句?

    以下是如何在Python中执行Microsoft SQL Server数据库的查询语句的完整使用攻略,包括安装pyodbc库、连接Microsoft SQL Server数据库、执行查询语句获取查询结果等步骤。同时,提供了两个示例以便更好理解如何在Python中执行 SQL Server数据库的查询语。 步骤1:安装pyodbc库 在Python中,我们可以…

    python 2023年5月12日
    00
  • Android Room的使用详解

    Android Room的使用详解攻略 什么是Android Room? Android Room是谷歌在Android SDK 2.2以上版本中提供的一个数据库持久层解决方案,它将SQLite数据库的功能集中到一个库中,以提供更容易使用的API并允许在编译时进行类型检查。同时,它还支持LiveData、RxJava和Kotlin协程等异步编程库的集成,可帮…

    database 2023年5月19日
    00
  • 如果redis没有设置expire,他是否默认永不过期?

    通过EXPIRE key seconds 命令来设置数据的过期时间。返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间。在key上设置了过期时间后key将在指定的秒数后被自动删除。被指定了过期时间的key在Redis中被称为是不稳定的。 Redis key过期的方式有三种: 惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删…

    Redis 2023年4月13日
    00
  • redis服务器允许远程主机访问的方法

    要允许远程主机访问Redis服务器,需要按照以下步骤进行配置: 修改redis.conf配置文件 首先,找到Redis安装目录下的redis.conf配置文件。如果Redis是通过apt-get或yum安装的,则文件路径可能为/etc/redis/redis.conf,如果是使用tar.gz包安装的,则文件路径可能为/usr/local/redis/redi…

    database 2023年5月22日
    00
  • ASCII码对照表以及各个字符的解释(精华版)

    ASCII码对照表是一种将字符与数字相对应的编码方式,它是计算机中最常用的编码方式之一。在 ASCII 码对照表中,每个可打印字符都与一个唯一的十进制数 (0~127) 相对应。以下是 ASCII 码对照表中表格的解释: 十进制 字符 描述 32     空格 48~57 0~9 数字 65~90 A~Z 大写字母 97~122 a~z 小写字母 127 D…

    database 2023年5月22日
    00
  • 简单谈谈centos7中配置php

    请先确认您的CentOS 7操作系统已经安装并开启了Web服务器及PHP支持,可以执行以下命令进行确认: httpd -v php -v 如果以上两个命令都能正常给出版本号,则说明您的系统已经配置好了Web服务器和PHP支持,可以跳过下面的步骤直接配置。 如果您的系统没有配置好Web服务器和PHP支持,请先按照以下步骤进行安装配置。 1. 安装Web服务器 …

    database 2023年5月22日
    00
  • SQL Server数据库复制失败的原因及解决方法

    SQL Server数据库复制失败的原因及解决方法 背景介绍 数据库复制是一种SQL Server常用的数据复制技术,通过它可以从一个SQL Server实例向另一个SQL Server实例复制数据。然而,有时候复制过程会出现失败的情况。本文将详细讲解SQL Server数据库复制失败的原因及解决方法。 问题原因 网络问题:网络问题是数据库复制失败的最常见原…

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