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

yizhihongxing

关于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日

相关文章

  • 详细讲解西软FOXHIS增量备份与恢复方法

    详细讲解西软FOXHIS增量备份与恢复方法 什么是FOXHIS增量备份 FOXHIS增量备份是一种备份策略,它可以仅备份数据发生变化的部分,而不是全量备份。这可以节省备份的时间和存储空间,并减小备份对系统性能的影响。 如何进行FOXHIS增量备份 FOXHIS增量备份需要借助工具来实现,以下是具体步骤: 打开FOXHIS程序,在主页面选择“设置”-“增量备份…

    database 2023年5月22日
    00
  • sql手工注入语句&SQL手工注入大全

    SQL手工注入攻略 什么是SQL注入攻击 SQL注入攻击是一种常见的Web安全漏洞,它的主要原理是手动构造一些特定的SQL查询语句,使得攻击者可以绕过应用程序的身份验证和授权机制,直接访问数据库中的敏感数据。 简单来说,当Web应用程序使用不安全的方式构造SQL查询语句时,黑客可以在输入框中插入恶意的SQL代码。当应用程序未能正确处理或验证输入时,这些SQL…

    database 2023年5月21日
    00
  • CentOS 安装redis和MySQL

    安装 redis: 更新系统软件源 在终端输入以下命令,更新系统软件源: sudo yum -y update 安装 EPEL 和 Remi 仓库 在终端输入以下命令,安装 EPEL 和 Remi 仓库: sudo yum install -y epel-release sudo rpm -Uvh http://rpms.famillecollet.com/…

    database 2023年5月22日
    00
  • Sqlserver 2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

    下面是关于“Sqlserver 2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法”的完整攻略。 问题描述 当我们在使用 SQL Server 2005时,有时会遇到“附加数据库时出错提示操作系统错误5(拒绝访问)错误5120”的问题。这一问题的原因在于 SQL Server 没有足够的权限访问我们要附加的数据库文件,从而导致出现错…

    database 2023年5月19日
    00
  • Mysql查询优化的一些实用方法总结

    Mysql查询优化的一些实用方法总结 在应用程序中,数据库查询是比较常见的操作,查询频率高和查询所得数据量大,常常会给系统性能带来瓶颈。因此,为了提高性能,提高用户访问速度,必须对数据库进行优化。下面介绍一些Mysql查询优化的实用方法。 建立适当的索引 索引是提高查询速度的关键,可以大幅提高查询效率。但是,索引并不是越多越好,过多的索引会影响更新操作和存储…

    database 2023年5月19日
    00
  • springboot开启声明式事务的方法

    下面是springboot开启声明式事务的方法的完整攻略。 一、前置知识 在了解开启声明式事务方法之前,需要了解以下几个方面的内容: 事务的概念和类型 Spring框架中的事务管理 AOP的概念及其实现 二、开启声明式事务的方法 1. 添加相关依赖包 在Spring Boot应用中需要添加spring-boot-starter-data-jpa和spring…

    database 2023年5月21日
    00
  • MySQL中的流式查询及游标查询方式

    MySQL中的流式查询(Streaming Queries)和游标查询(Cursor Queries)是在处理超大数据集时非常有用的查询方式。它们可以逐行、逐块(chunk)地处理数据,节约内存开销和减少运行时间。下面将详细介绍如何使用它们。 流式查询 什么是流式查询? 流式查询是在MySQL 5.6版本后引入的一种查询方式。它通过分批次将查询结果逐行返回给…

    database 2023年5月22日
    00
  • laravel框架数据库配置及操作数据库示例

    下面是关于”Laravel框架数据库配置及操作数据库示例”的完整攻略: Laravel框架数据库配置 首先,我们需要在Laravel框架中配置数据库,这样我们才能连接和操作数据库。Laravel框架默认使用Eloquent ORM来操作数据库,我们可以通过修改”.env”文件中的数据库连接变量来配置Laravel的数据库。 修改”.env”文件: DB_CO…

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