【已解决】MySQL 事务回滚机制失效之误用 truncate 删除表数据

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【已解决】MySQL 事务回滚机制失效之误用 truncate 删除表数据

🎉在工作场景中遇到这样一个需求,对表中的数据进行更新,更新的步骤是:首先,删除表中所有的数据记录;之后,再将更新过后的数据插入到表中。由于系统业务逻辑相关的原因,在数据插入时可能会出现异常,因此当出现异常而终止插入过程,需要能够将事务进行回滚,恢复之前删除的数据。

✨这里肯定是需要使用事务进行控制了,那么在使用 Spring 框架提供的声明式事务注解方式@Transactional ,并确认避免了事务失效的几种情况之后,在测试接口时事务还是没有生效。

✨以下是主要的相关方法实现:

@Transactional(rollbackFor = Exception.class)
public void runDeptTask() {
  //to do something
  try {
    deptMapper.deleteAll();
    //to do something
  } catch (Exception e) {
    e.printstack();
    // due to the exception was swallowed, rollbacking manually 
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  }
}

✨在确认 Java 代码层面并没有问题之后,便开始从数据库层面开始排查问题。首先,检查是否使用了支持事务的存储引擎,确认 MySQL 数据库使用了 InnoDB 引擎并开启了事务机制。之后,在检查 SQL 语句时发现,删除数据时的语法使用了 truncate,而不是使用 delete 语法。

✨这时便回忆起,为了保证事务的原子性,InnoDB 引擎在实际进行记录的增删改操作时,都需要先把 undo 日志记下来,便于之后进行回滚。这里的增删改对应的语法是:insert、delete、update,没有对使用 truncate 删除的 undo 日志。这便是发生问题的所在之处了,因此需要将删除时使用的语法改为 delete,这样才能使得事务回滚起效,问题得到解决。

这里顺便提一下为什么当时使用 truncate,主要是因为使用 truncate 不会写入 undo 日志,既降低了服务器硬盘资源的消耗,又避免了因写入日志操作带来的时间消耗,因此 truncate 删除表数据的效率非常高,特别是当删除大量数据时,truncate 和 delete 所需要的时间差异尤为明显。

✨更改过后的 SQL 语句如下:

DeptMapper.xml

<delete id = "deleteAll">
  <!--truncate table sys_dept-->
  delete from sys_dept
</delete>

✨在确认 Java 代码层面并没有问题之后,便开始从数据库层面开始排查问题。首先,检查是否使用了支持事务的存储引擎,确认 MySQL 数据库使用了 InnoDB 引擎并开启了事务机制。之后,在检查 SQL 语句时发现,删除数据时的语法使用了 truncate,而不是使用 delete 语法。


✨这时便回忆起,为了保证事务的原子性,InnoDB 引擎在实际进行记录的增删改操作时,都需要先把 undo 日志记下来,便于之后进行回滚。这里的增删改对应的语法是:insert、delete、update,没有对使用 truncate 删除的 undo 日志。这便是发生问题的所在之处了,因此需要将删除时使用的语法改为 delete,这样才能使得事务回滚起效,问题得到解决。

这里顺便提一下为什么当时使用 truncate,主要是因为使用 truncate 不会写入 undo 日志,既降低了服务器硬盘资源的消耗,又避免了因写入日志操作带来的时间消耗,因此 truncate 删除表数据的效率非常高,特别是当删除大量数据时,truncate 和 delete 所需要的时间差异尤为明显。

✨更改过后的 SQL 语句如下:

DeptMapper.xml

<delete id = "deleteAll">
  <!--truncate table sys_dept-->
  delete from sys_dept
</delete>
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之用脚本的方式同步数据到MySQL,怎么指定列作为目标表为唯一行
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
3天前
|
分布式计算 DataWorks 关系型数据库
实时数仓 Hologres产品使用合集之如何将MySQL数据初始化到分区表中
实时数仓Hologres的基本概念和特点:1.一站式实时数仓引擎:Hologres集成了数据仓库、在线分析处理(OLAP)和在线服务(Serving)能力于一体,适合实时数据分析和决策支持场景。2.兼容PostgreSQL协议:Hologres支持标准SQL(兼容PostgreSQL协议和语法),使得迁移和集成变得简单。3.海量数据处理能力:能够处理PB级数据的多维分析和即席查询,支持高并发低延迟查询。4.实时性:支持数据的实时写入、实时更新和实时分析,满足对数据新鲜度要求高的业务场景。5.与大数据生态集成:与MaxCompute、Flink、DataWorks等阿里云产品深度融合,提供离在线
|
6天前
|
存储 关系型数据库 MySQL
MySql创建带事务操作的存储过程
MySql创建带事务操作的存储过程
|
1天前
|
消息中间件 分布式计算 关系型数据库
使用Apache Spark从MySQL到Kafka再到HDFS的数据转移
使用Apache Spark从MySQL到Kafka再到HDFS的数据转移
|
1天前
|
SQL 关系型数据库 MySQL
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
|
1天前
|
关系型数据库 MySQL API
用Python一键艺龙酒店各个城市数据存入mysql
用Python一键艺龙酒店各个城市数据存入mysql
|
2天前
|
Cloud Native 关系型数据库 MySQL
云原生数据仓库AnalyticDB产品使用合集之是否支持mysql_fdw 和clickhousedb_fdw外部数据包装器
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
2天前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之数据源同步时,使用脚本模式采集mysql数据到odps中,使用querySql方式采集数据,在脚本中删除了Reader中的column,但是datax还是报错OriginalConfPretreatmentUtil - 您的配置有误。如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4天前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之当需要将数据从ODPS同步到RDS,且ODPS表是二级分区表时,如何同步所有二级分区的数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
16 7
|
5天前
|
分布式计算 DataWorks 关系型数据库
MaxCompute产品使用合集之DataWorks是否支持通过SQL方式在MaxCompute中查询数据,并通过数据集成服务将查询结果同步至MySQL数据库
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。