只能获取fixed语句初始值_因用了Insert into select语句,美女同事被开除了!

点击上方 web项目开发,选择 设为星标

优质文章,及时送达

--

Insert into select请慎用。这天xxx接到一个需求,需要将表A的数据迁移到表B中去做一个备份。本想通过程序先查询查出来然后批量插入。但xxx觉得这样有点慢,需要耗费大量的网络I/O,决定采取别的方法进行实现。通过在Baidu的海洋里遨游,她发现了可以使用insert into select实现,这样就可以避免使用网络I/O,直接使用SQL依靠数据库I/O完成,这样简直不要太棒了。然后她就被开除了。

事故发生的经过。

由于数据数据库中order_today数据量过大,当时好像有700W了并且每天在以30W的速度增加。所以上司命令xxx将order_today内的部分数据迁移到order_record中,并将order_today中的数据删除。这样来降低order_today表中的数据量。

由于考虑到会占用数据库I/O,为了不影响业务,计划是9:00以后开始迁移,但是xxx在8:00的时候,尝试迁移了少部分数据(1000条),觉得没啥问题,就开始考虑大批量迁移。

7759fe2d6b96f41e88d37ca6ee1521ea.png

在迁移的过程中,应急群是先反应有小部分用户出现支付失败,随后反应大批用户出现支付失败的情况,以及初始化订单失败的情况,同时腾讯也开始报警。

37e7a68867f40bc6b4946e7b5a1a281f.png

然后xxx就慌了,立即停止了迁移。

本以为停止迁移就就可以恢复了,但是并没有。后面发生的你们可以脑补一下。

# 事故还原

在本地建立一个精简版的数据库,并生成了100w的数据。模拟线上发生的情况。

# 建立表结构

订单表

CREATE TABLE `order_today` (`id` varchar(32) NOT NULL COMMENT '主键',`merchant_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商户编号',`amount` decimal(15,2) NOT NULL COMMENT '订单金额',`pay_success_time` datetime NOT NULL COMMENT '支付成功时间',`order_status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '支付状态  S:支付成功、F:订单支付失败',`remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '备注',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间 -- 修改时自动更新',  PRIMARY KEY (`id`) USING BTREE,KEY `idx_merchant_id` (`merchant_id`) USING BTREE COMMENT '商户编号') ENGINE=InnoDB DEFAULT CHARSET=utf8;

订单记录表

CREATE TABLE order_record like order_today;

今日订单表数据

8dec3b15e05de8f69cbe408b75a29928.png

# 模拟迁移

把8号之前的数据都迁移到order_record表中去。

INSERT INTO order_record SELECT    * FROM    order_today WHERE    pay_success_time < '2020-03-08 00:00:00';

在navicat中运行迁移的sql,同时开另个一个窗口插入数据,模拟下单。

4c3d1cc23c6d9fb6765dc16d5f65a98a.png

9d1a852f746ce17f73158e6ec8950d99.png

8216ff936e26f5c9e014632100596333.png

从上面可以发现一开始能正常插入,但是后面突然就卡住了,并且耗费了23s才成功,然后才能继续插入。这个时候已经迁移成功了,所以能正常插入了。

# 出现的原因

在默认的事务隔离级别下:insert into order_record select * from order_today 加锁规则是:order_record表锁,order_today逐步锁(扫描一个锁一个)。

分析执行过程。

b8557ad63122611d64257e444df2aab1.png

通过观察迁移sql的执行情况你会发现order_today是全表扫描,也就意味着在执行insert into select from 语句时,mysql会从上到下扫描order_today内的记录并且加锁,这样一来不就和直接锁表是一样了。

这也就可以解释,为什么一开始只有少量用户出现支付失败,后续大量用户出现支付失败,初始化订单失败等情况,因为一开始只锁定了少部分数据,没有被锁定的数据还是可以正常被修改为正常状态。由于锁定的数据越来越多,就导致出现了大量支付失败。最后全部锁住,导致无法插入订单,而出现初始化订单失败。

# 解决方案

由于查询条件会导致order_today全表扫描,什么能避免全表扫描呢,很简单嘛,给pay_success_time字段添加一个idx_pay_suc_time索引就可以了,由于走索引查询,就不会出现扫描全表的情况而锁表了,只会锁定符合条件的记录。

最终的sql

INSERT INTO order_record SELECT    * FROM    order_today FORCE INDEX (idx_pay_suc_time)WHERE    pay_success_time <= '2020-03-08 00:00:00';

执行过程

92fcc879b8af2203cdbb785f77f81ee0.png

# 总结

使用insert into tablA select * from tableB语句时,一定要确保tableB后面的where,order或者其他条件,都需要有对应的索引,来避免出现tableB全部记录被锁定的情况。

# 参考

  • https://blog.csdn.net/asdfsadfasdfsa/article/details/83030011

作者:不一样的科技宅来源:juejin.im/post/5e670f0151882549274a65ef

--完--

推荐案例

  • Springboot+Vue前后端分离实现Excle文件导入并在前端页面回显功能

  • Springboot+Vue实现从数据库中获取数据生成树状图在前端页面展示功能

  • Springboot+Vue实现从数据库中获取数据生成饼状图并在前端页面展示功能

  • Springboot+Vue实现批量文件上传(pdf、word、excel)并支持在线预览功能

  • Springboot+Vue实现滑动验证成功后登录功能

  • Springboot+Vue实现从数据库中获取数据生成折线图并在前端页面展示功能

  • Springboot+Vue实现网页内容生成图片功能

  • Springboot+Vue实现信息批量修改功能

  • 查看全部案例...

温暖提示

64d08f1941b5f258c662d146717a1bad.png为了方便大家更好的学习,本公众号经常分享一些完整的单个功能案例代码给大家去练习,如果本公众号没有你要学习的功能案例,你可以联系小编(微信:xxf960513)提供你的小需求给我,我安排我们这边的开发团队免费帮你完成你的案例。注意:只能提单个功能的需求不能要求功能太多,比如要求用什么技术,有几个页面,页面要求怎么样?

请长按识别二维码

想学习更多的java功能案例请关注

Java项目开发

0efba58bdabdcbd1e16a9c1a44b9bea6.png682776c8cff3f27886a81324fe56b9c8.gif

如果你觉得这个案例以及我们的分享思路不错,对你有帮助,请分享给身边更多需要学习的朋友。别忘了《留言+点在看》给作者一个鼓励哦!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python获取excel数据进行判断输出结果到excel,如何使用python xlrd/xlwt从一个excel工作簿提取数据并输出到另一个excel工作簿?...

我正在为xlutils、xlrd和xlwt创建一个名为excel functions的类&#xff0c;最终我可能会创建一个库。如果你有兴趣帮我做一个删除工作表的功能。您可能希望转向openpyxl和/或pyexcel&#xff0c;因为它们更容易实现&#xff0c;并且有相应的功能。如果要从一个excel工作簿提取数…

php中sql格式化字符串,sqli注入-sprintf格式化字符串带来的注入隐患

PHP中 sprintf()格式化输出详解sprintf()函数把格式化的字符串写入变量中。arg1、arg2、参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个%符号处&#xff0c;插入arg1,在第二个%符号处&#xff0c;插入arg2&#xff0c;以此类推。注释&#xff1a;如…

mybatis依赖_这大概就是公司一直用Mybatis的原因!真的太强了

01 什么是MyBatis、Spring&#xff1f;MyBatis是什么&#xff1f;它是一个SQL Mapping框架&#xff0c;它是一个持久化技术框架。再说得简单一点&#xff0c;它只不过是一个操作数据库的框架。Spring是什么&#xff1f;Spring就是一个大容器&#xff0c;不管是IoC还是AOP&#…

php excelreader 中文,如何解决php excel reader导出excel中文乱码?

解决php excel reader导出excel中文乱码的方法&#xff1a;1、如果不使用dump函数&#xff0c;可以通过修改【_defaultEncoding】变量解决问题&#xff1b;2、如果使用dump函数导出excel&#xff0c;需要修改htmlentities函数解决。解决php excel reader导出excel中文乱码的方法…

python画同心圆程序_Python Turtle:使用circle()方法绘制同心圆

I am not at this point interested in an efficient way of producing concentric circles: I want to see what I have to do to get this way to work 为了解决OP的问题&#xff0c;对其原始代码进行更改以使其正常工作是很简单的&#xff1a;turtle_pos(trl, [trl.xcor() …

绕过宝塔禁止的php函数,宝塔disable functions函数全被禁命令执行+加域服务器如何无限制执行命令...

本地搭建实验环境时遇到了不少小问题实验环境2008 R2宝塔搭建的IIS discuz3.2X手动上传shell冰蝎连接(ps:有表哥使用冰蝎的时候提示文件存在但是无法获取密钥&#xff0c;解决办法&#xff0c;使用最新版本的冰蝎即可&#xff0c;具体详情看更新日志)连接上shell发现无法执行命…

anaconda和python区别_初学 Python 者自学 Anaconda 的正确姿势是什么?

事实上Anaconda 和 Jupyter notebook已成为数据分析的标准环境。 简单来说&#xff0c;Anaconda是包管理器和环境管理器&#xff0c;Jupyter notebook 可以将数据分析的代码、图像和文档全部组合到一个web文档中。 接下来我详细介绍下Anaconda&#xff0c;并在最后给出Jupyter …

oracle rman备份整库,RMAN备份恢复整个库

RMAN备份恢复整个库1 查看历史备份集$ rman target /RMAN> list backup;说明与资料档案库中的任何备份都不匹配上述结果说明之前没有备份过2 备份整个库RMAN> backup database;启动 backup 于 21-3月 -15使用通道 ORA_DISK_1通道 ORA_DISK_1: 正在启动全部数据文件备份集…

oracle 24756,关于ORA-24756: transaction does not exist的问题

最近在检查一个数据库时&#xff0c;发现跟踪日志有大量的错误( ORA-24756: transaction does not exist)1、主机系统环境IBM P740#oslevel -s6100-06-05-11152、数据库版本11.2.0.3 RAC ASM两节点3、在数据库跟踪日志中出现大量错误。(alert文件太大无法上传&#xff0c;几乎…

python 函数 全局变量_python3函数内全局变量使用global

原博文 2017-08-16 23:08 −def p_num(): global num num 10 print (num) num 5 p_num() print(num) ... 相关推荐 2019-12-11 15:55 − 如果需要在函数内部改变函数外部的变量&#xff0c;就可以通过在函数内部声明变量为global变量。这样当程序运行至global变量便会替换外部…

java 切面_Java笔试面试精心整理得到89道Spring 核心知识【收藏向】

点击上方"蓝字"&#xff0c;关注了解更多Spring Framework 简称 Spring&#xff0c;是 Java 开发中最常用的框架&#xff0c;地位仅次于 Java API&#xff0c;就连近几年比较流行的微服务框架 SpringBoot&#xff0c;也是基于 Spring 实现的&#xff0c;SpringBoot 的…

安装oracle 10g闪退,Windows 7安装Oracle 10g常见错误及解决方法

Windows 7安装Oracle 10g常见错误及解决方法在安装之前&#xff0c;我们要先下载相应的版本。点击&#xff1a;Oracle 10g支持Win7版错误A&#xff1a;正在检查操作系统要求...要求的结果: 5.0,5.1,5.2,6.0 之一实际结果: 6.1检查完成。此次检查的总体结果为: 失败 <<<…

python爬取百度文库_利用Python语言轻松爬取数据

利用 Python 语言轻松爬取数据 对于小白来说&#xff0c;爬虫可能是一件非常复杂、 技术门槛很高的事情。 比如有人认为学爬虫必须精通 Python &#xff0c;然后哼哧哼哧系统学习 Python 的每个知识点&#xff0c;很久之后发现仍然爬不了数据&#xff1b;有的人则认为先要掌握 …

切比雪夫不等式例题讲解_排序不等式,切比雪夫不等式及伯努利不等式

我们比较熟悉的不等式可能就是下面的这个不等式链以及柯西不等式了&#xff1a;对于不等式链的证明我们可以看下面这张图&#xff0c;非常直观形象&#xff1a;不太懂得也可以看这个视频讲解&#xff1a;知乎视频​www.zhihu.com对于柯西不等式的证明及讲解&#xff0c;我们之前…

任务计划命令 linux,linux执行一次性任务计划at命令

at跟crontab一样&#xff0c;都是执行定时计划任务的命令。但不同的是&#xff0c;crontab执行的循环的任务&#xff0c;而at执行的是一次性任务&#xff0c;任务执行完以后便失效。设置任务&#xff1a;at now 1 week -f a.sh #a.sh必须已存在at 01:35 < my-at-jobs.…

linux逻辑文件块,linux逻辑卷组创建以及修改

创建逻辑卷组&#xff1a;一、将扩展的硬盘分区新加一块SCSI硬盘&#xff0c;需要将其分成三个区&#xff1a;代码:#fdisk /dev/sdb进入fdisk模式&#xff1a;Command (m for help):p //查看新硬盘的分区Command (m for help):n //创建新分区可以用m命令来看fdisk命令的内部命…

经济学原理 下载 曼昆_2021南开经济学考研全年规划

先介绍一下本文的作者&#xff0c;本人本科来自于某双非财经类院校&#xff0c;于2019年考入南开大学某应用经济学专业&#xff0c;在2019年考研初始专业课826经济学基础&#xff08;也就是20年的823&#xff09;中拿到了138分的成绩&#xff0c;自认为对专业课的复习有一定心得…

linux系统进程控制实验报告,Linux进程控制实验报告.doc

里奴性进程控制实验报告实验名称: Linux进程控制实验要求:一.编写一个Linux系统C程序&#xff0c;由父亲创建2个子进程&#xff0c;再由子进程各自从控制台接收一串字符串&#xff0c;保存在各自的全局字符串变量中&#xff0c;然后正常结束。父进程调用waitpid等待子进程结束&…

excel中如何对矩阵得对角线进行求和_如何利用图卷积网络进行图形深度学习(第2部分)...

图上的机器学习是一项艰巨的任务&#xff0c;由于高度复杂但信息量丰富&#xff0c;本文是关于如何利用图卷积网络(GCN)进行深度学习的系列文章中的第二篇。我将简要回顾一下上一篇文章&#xff1a;图形卷积网络的高级介绍具有谱图卷积的半监督学习(本文)简要回顾一下在上一篇关…

linux内存不足+段错误,在linux下代码运行出现段错误,求大神

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include #include#include#define PATH1 "/proc/meminfo"#define PATH2 "/proc/cpuinfo"#define PATH3 "/proc/version"#define PATH4 "/proc/bus/usb/devices"struct M…