跑路代码已上线,坐等删库中~

前言

或许大家会认为删库跑路都是运维或者DBA的事情,或许认为我没有线上数据库权限就不可能删库跑路。但是事实并非如此,建议大家仔细阅读此文章,赶紧排查下您的代码,很可能隐藏着这种删库程序。还是要呼吁大家,这个案例大家不要学习!不要学习!不要学习!重要的事情说三遍。

业务BUG现象

最近,我们收到一位研发小伙伴的反馈,他发现了一项safety级别的bug,仅仅是执行了一个简单的数据删除操作,就差点把几百万业务流转表数据全部删除了,要是被老板知道妥妥的被劝退!马上就打算跑路了,好在及时才避免严重后果的发生。究竟发生了什么?让我们在回顾一下这位小伙伴所遭遇的问题。

开发业务需求

需求是要根据业务任务流转ID进行软删除,然后通过定时任务定期清理,于是该研发同学写了下面一个方法代码来进行此操作。以下为抽象后的代码逻辑:

//业务流转任务更新
public void updateTaskError(long taskId) throws SQLException {
    String updateSql = "UPDATE business_task SET status = '0' WHERE task_id = ?";
    try (PreparedStatement pstmt = connection.prepareStatement(updateSql)) {
        pstmt.setInt(1, taskId);
        pstmt.executeUpdate();
    }
}

//定时任务定期清理
public void deleteErrorTask() throws SQLException {
    String deleteSql = "DELETE FROM business_task WHERE status = 0";
    try (PreparedStatement pstmt = connection.prepareStatement(deleteSql)) {
        pstmt.executeUpdate();
    }
}

更新逻辑本身很简单,code review没看出问题,自测由于定时任务没有触发,所以也没有发现问题。但到了测试手里,却发现数据全没了,这要是发布到了线上,后果将非常严重!

开发同学自查,到底哪条SQL导致?

开发本地开启SQL打印后,复现场景,是这样一条SQL:

DELETE FROM business_task WHERE status = 0;

该业务任务表的status一般取值为枚举类型,比如running、success等,这里的0表示任务异常,需要进行清除。看起来这条SQL语句会清理掉异常任务,没啥问题!难道是SQL发生了隐式转换导致的?

隐式转换问题,好坑呀!

MySQL官方文档翻一翻,这个SQL为何会有隐式转换呢?

# 这里是官方文档关于隐式转换浮点数比较规则
In all other cases, the arguments are compared as floating-point (double-precision) numbers. For example, a comparison of string and numeric operands takes place as a comparison of floating-point numbers.

上面的大致解释:MySQL 会尝试从字符串中解析尽可能多的有效数字,直到遇到非数字字符或者无法继续形成有效的浮点数:
1)如果字符串无法转换为有效的浮点数,MySQL将返回0
2)字符串以浮点数字开头,将截取出有效的浮点数,例如:

  • ‘123.45xyz’ -> 123.45
  • ‘xyz123’ ->0

在MySQL中执行手动验证转换规则:

mysql> select CAST('123.45xyz' as DECIMAL(10, 2));
+-------------------------------------+
| CAST('123.45xyz' as DECIMAL(10, 2)) |
+-------------------------------------+
|                              123.45 |
+-------------------------------------+
1 row in set (0.00 sec)


mysql> select CAST('xyz123' as DECIMAL(10, 2));
+----------------------------------+
| CAST('xyz123' as DECIMAL(10, 2)) |
+----------------------------------+
|                             0.00 |
+----------------------------------+
1 row in set, 1 warning (0.00 sec)

验证后确实和上面规则中的结果一致,那业务SQL是如何触发隐式转换的呢?我们进一步进行分析。

原始业务SQL如何转换?

分析代码,发现业务SQL中的status含有非数字开头的字符串,按照隐式转换会转变成0,实际内部转换的大致如下:

DELETE FROM business_task WHERE cast(‘success’ as unsigned) = 0;

那么当定时任务触发时,在MySQL5.6版本的数据库上执行该SQL,相当于全表进行了删除,至此,业务bug已定位完成,只需将0改成’0’即可解决问题。

如何利用DBdoctor快速定位隐式类型转换?

使用DBdoctor,只需两步即可完成SQL审核的隐式转换检测:

Step 1:点击【实例诊断】

登录DBdoctor点击【实例列表】,选择对应的租户项目,找到系统涉及的实例,然后点击【实例诊断】

在这里插入图片描述

Step 2:查看【SQL审核】,输入业务SQL,点击审核:

批量上传待审核的SQL(可从测试环境导出)或者输入指定SQL,点击审核即可。

在这里插入图片描述

查看结果,发现该SQL存在隐式类型转换问题,及时处理问题SQL。

总结

各位研发小伙伴们,你们是否也会经常遇到类似问题,因为执行了一条不当的SQL更新语句,就险些造成了灾难性的数据故障!为避免这些不必要问题的发生,马上部署DBdoctor,使用SQL审核功能,快速识别潜在问题,无需生产发布和变更,就能提前评估SQL语句在实际部署后可能遇到的性能问题,并推荐最佳的全局索引策略,以确保数据库操作的高效和安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/745669.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三级医院智慧医院信息化规划方案(65页PPT)

方案介绍: 该方案通过信息化手段实现医院信息化全覆盖,优化诊疗流程、提高诊疗效率和准确性;同时实现医疗资源的合理配置和共享,提升医疗服务质量。通过优化患者就医流程、提供便捷的服务和宣传健康知识等方式提高患者满意度。通…

苏州大学气膜综合馆成为师生活动新中心—轻空间

苏州大学应用技术学院的气膜综合馆自建成以来,已成为校园内的热门活动场所。由轻空间(江苏)膜科技有限公司(以下简称“轻空间”)全力打造,这座现代化、环保的多功能运动场馆,不仅为师生提供了一…

代码随想录第35天|动态规划

理论基础 动态规划是由前一个状态推导出来的, 而贪心是局部直接选取最优 五部曲: 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 debug过程 : dp数组打印查看 509. 斐波那契数 参考 //动态规划的方法 …

Python基础教程——常用的36个经典案例!

Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍36个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。(文末附带精品学习资料) 1. 列表推导式 fizz_buzz_list [ "FizzBuzz" if i % 15 0 else "Fizz&qu…

陪玩系统源码,陪玩平台源码,陪玩app源码搭建

游戏陪玩app开发,软件搭建,程序制作、系统设计 目前,中国约有五到六亿游戏玩家,其中大约有两亿人选择付费游戏。这显示了绝大多数玩家都愿意为他们喜欢的游戏付费。随着游戏体验的不断改善,越来越多的玩家更倾向于找到…

基于Java的汽车租赁系统【附源码】

论文题目 设计(论文)综述(1000字) 当今社会,汽车租赁已成为一种受欢迎的出行方式。本文旨在探讨汽车租赁行业的发展趋势、市场规模及其对环境的影响。目前,汽车租赁行业正在经历着快速的发展。随着经济的发…

3D资产爆发,轻量化需求再度冲高,见证下一代3D崛起!

数字经济不断发展,3D资产和实体经济迎来深度融合的窗口期,3D资产应用外延催生大量新场景、新业态,一个3D资产构建的数字世界正出现在我们眼前。 数字经济不断发展,3D资产和实体经济迎来深度融合的窗口期,3D资产应用外…

【TB作品】MSP430,G2533单片机,红外发射,红外接收,红外通信,IR发射

文章目录 题目红外NEC协议介绍基本概述数据帧结构位表示数据传输示例重复码(Repeat Code)实现细节发送端接收端 典型应用结论 最终效果代码 题目 遥控器 硬件:msp430g2553、oled显示器、ds18b20温度传感器、红外发射器、按键 软件功能&#…

OpenAI用GPT-4o打造癌症筛查AI助手;手机就能检测中风,准确率达 82%!中国气象局发布AI气象大模型...

AI for Science 企业动态速览—— * 皇家墨尔本大学用 AI 检测患者中风,准确率达 82% * OpenAI 用 GPT-4o 模型打造癌症筛查 AI 助手 * 中国气象局发布 AI 气象大模型风清、风雷、风顺 * AI 药企英矽智能:小分子抑制剂已完成中国 IIa 期临床试验全部患者…

Socket——向FTP服务器发送消息并获得响应

1、简介 Socket(套接字)是网络编程中用于描述IP地址和端口的一个抽象概念,通过它可以实现不同主机间的通信。套接字可以分为几种不同的类型,每种类型对应不同的协议和传输模式。 1.1、基本概念 IP地址:用于标识网络…

厂区滴漏智能识别摄像机

当今,随着智能技术的迅猛发展,智能识别摄像机正逐步应用于各个行业,特别是在工业生产环境中,其作用愈发凸显。其中,厂区滴漏智能识别摄像机的应用成为了保障生产安全和环境保护的重要手段之一。厂区滴漏智能识别摄像机…

简述Java项目中VO,BO,PO,DO,DTO之类的文件概念、易混点

VO,BO,PO,DO,DTO 概念易混点一:VO和DTO- 让我们通过一个实例来阐释DTO和VO的概念及其应用差异:小结:VO专注于展示,而DTO则用于数据的传输和业务逻辑的处理。 二:BO和PO小…

记录 Bonobo Git 服务器 SMTP 设置

Bonobo 使用标准的 .NET SMTP 设置&#xff0c;可以在 web.config 中指定这些设置。 <system.net><mailSettings><smtp deliveryMethod"network" from"bonobobonoserver.your.domain"><network host"accessible.smtp.host"…

用一个暑假|用AlGC-stable diffusion 辅助服装设计及展示,让你在同龄人中脱颖而出!

大家好&#xff0c;我是设计师阿威 Stable Diffusion是一款开源AI绘画工具&#xff0c; 用户输入语言指令&#xff0c;即可自动生成各种风格的绘画图片 Stable Diffusion功能强大&#xff0c;生态完整、使用方便。支持大部分视觉模型上传&#xff0c;且可自己定制模型&#x…

AI X HI:塑造数智时代的人类镜像,网易这场分享不能错过!

2001 年&#xff0c;网易正式成立在线游戏事业部。从那以后&#xff0c;网易孵化了许多出圈的精品游戏&#xff0c;跻身成为全球七大游戏公司之一。这些游戏产品之所以能够广受玩家好评&#xff0c;并保持常青&#xff0c;一方面源于十年磨一剑的精良品质&#xff0c;另一方面则…

基于微信小程序的在线点餐系统【前后台+附源码+LW】

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 点餐小程序&#xff0c;主要的模块包括实现管理员&#xff1b;管理员用户&#xff0c;可以对整个系统进行基本的增删改查&#xff0c;系统的日…

一文详解:生产计划和排产管理怎么做?

通过阅读本文&#xff0c;你可以了解以下内容&#xff1a;1、生产计划的制定&#xff1b;2、排产的策略和方法&#xff1b;3、生产计划和排产管理实施&#xff1b;4、生产计划和排产管理的效果评估。 一、生产计划制定 生产计划的本质就是协调企业一切资源“低成本、高质量”…

“RLC串联正弦稳态电路的仿真研究”课程设计,高分资源,匠心制作,下载可用。强烈推荐!!!

1.设计目的 用 Multisim 电路仿真软件&#xff0c;对一个 RLC 串联电路进行正弦稳态电路分析。 2任务分析 2.1任务要求1 在 Multisim 中搭建一个 RLC 串联电路&#xff0c;其中 R、 L、 C、正弦激励源的振幅Vp和频率 f 等所有参数均可自己任意设置&#xff08;不建议都采用…

wordpress建站有哪些优点

对于绝大多数站长来说&#xff0c;使用wordpress建站是一个非常不错的选择。那么wordpress建站有哪些优点呢&#xff1f;下面小编就来为大家解答。 1.wordpress是什么&#xff1f; WordPress是一款全球最受欢迎的内容管理系统&#xff08;CMS&#xff09;&#xff0c;主要用于…

当前的网安行业绝对不是高薪行业

昨天&#xff0c;面试了一个刚毕业两年的同学小A。第一学历为某大专&#xff0c;第二学历为某省地区的本科院校。面试过程表现一般偏下&#xff0c;但动不动就要薪资15K 这个人&#xff0c;我当场就PASS了。主要原因是&#xff0c;并非是否定小A同学的能力&#xff0c;而是他…