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

相关文章

  • Python使用MySQLdb for Python操作数据库教程

    我们来详细讲解一下Python使用 MySQLdb 操作数据库的完整攻略。 准备工作 在使用 Python 操作 MySQL 数据库之前,我们需要安装 Python 的 MySQLdb 模块。我们可以通过 pip 命令进行安装。 在 Windows 系统下,我们可以使用以下命令: pip install MySQL-python 在 Linux 或 Mac …

    database 2023年5月22日
    00
  • SQL Server 2005附加数据库时Read-Only错误的解决方案

    以下是详细的攻略。 问题描述 在将 SQL Server 2005 数据库附加到实例时,可能会遇到以下错误: Msg 262, Level 14, State 1, Line 1 CREATE DATABASE permission denied in database ‘master’. Msg 1813, Level 16, State 2, Line …

    database 2023年5月21日
    00
  • 在MySQL中创建实现自增的序列(Sequence)的教程

    在MySQL中创建实现自增的序列,可以使用自增主键、触发器和存储过程等方式实现。下面是具体的攻略: 使用自增主键 创建表时,指定主键字段的类型为INT AUTO_INCREMENT,并将该字段设为主键,代码如下: CREATE TABLE demo ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) )…

    database 2023年5月21日
    00
  • 解决linux的redhat版上mysql字符乱码的问题

    首先需要了解关于 MySQL 字符集和字符编码的概念。MySQL 数据库中使用字符集(character set)来表示所有的字符,字符编码(collation)用于确定如何比较和排序这些字符。在 Redhat Linux 上的 MySQL 安装默认使用的字符集是 latin1,而这个字符集可能会导致字符乱码的问题。 为了解决这个问题,可以按照以下步骤修改 …

    database 2023年5月22日
    00
  • 非常不错的MySQL优化的8条经验

    非常不错的MySQL优化的8条经验 MySQL 是一种现代的数据库管理系统,广泛用于各种类型的 Web 应用程序中。当您的应用程序承载大量数据时,优化 MySQL 数据库非常重要。本文将介绍一些简单的技术,可以帮助您优化MySQL 数据库性能,提高您的应用程序的响应速度。 1. 使用正确的数据类型 当设计表时,请始终使用最小的数据类型。例如,如果您需要存储一…

    database 2023年5月22日
    00
  • Java连接操作redis

    redis官方推荐使用jedis操作redis 导入依赖 <!– https://mvnrepository.com/artifact/redis.clients/jedis –> <dependency> <groupId>redis.clients</groupId> <artifactId&gt…

    Redis 2023年4月11日
    00
  • 读取纯真IP数据库的公用组件接口QQWry.NET

    读取纯真IP数据库的公用组件接口QQWry.NET是一个可以在 .NET 平台(C# 或者 VB)上读取纯真IP库的公共组件,支持各种内网、外网、Windows、Linux 等各种环境下的 IP 查询操作。 下面是详细的使用攻略: 1. 下载QQWry.NET组件 QQWry.NET组件可以从官网(https://www.nuget.org/packages…

    database 2023年5月22日
    00
  • mysql数据库优化总结(心得)

    MySQL数据库优化总结(心得) 为什么要进行数据库优化 数据库是网站应用的核心,因此,数据库优化是网站优化中最重要的一环。数据库优化可以大大提高网站的响应速度,增强网站的稳定性和安全性,提高网站的用户体验,进而促进网站发展。 MySQL数据库优化的几个方面 1. 维护数据库结构 优化表结构:根据业务需要,尽量减少表中的字段数量和字段长度,避免使用BLOB、…

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