只能获取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,一经查实,立即删除!

相关文章

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 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 的…

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

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

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

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

linux 开放5222端口,ejabberd 安装配置

ejabberdejabberd是基于Jabber/XMPP协议的即时通讯服务器&#xff0c;由GPLv2授权(免费和开放源码)&#xff0c;采用Erlang/OTP开发。它的特点是&#xff0c;跨平台&#xff0c;容错&#xff0c;集群和模块化。ejabberd安装&#xff1a;1. 下载安装包&#xff1a;2.给权限&…

docker查找镜像_5 款非常好用的开源 Docker 工具,get一波~

本文同步Java知音社区&#xff0c;专注于Java作者&#xff1a;Shekhar Gulatihttp://dzone.com/articles/5-docker-utilities-you-should-know导读Docker 社区已经创建了许多开源工具&#xff0c;它们能帮我们处理各种用例。作者在本文中推荐了 5 款认为最有用的 Docker 工具&a…

else应输入一个语句是什么意思_Python学习基础篇 -4: Python中的转弯---分支语句

前言&#xff1a;本专栏以Python为主题&#xff0c;并尽可能保持每星期两到三更&#xff0c;直到将Python的基础知识浅析和讲解完毕&#xff0c;同时&#xff0c;有一定基础的同学可以移步 Python实战专栏 。背景&#xff1a;对于该系列文章的前三篇&#xff0c;自己读过的同学…

ofdm原理_OFDM技术简介

今日光电有趣、有料、有深度光电技术及科技资讯分享让整个世界变得温暖&#xff0c;他人因你的分享而变好&#xff01;欢迎分享有价值的东西&#xff01;今日光电因你而变&#xff0c;欢迎留言、分享...我们一起用科技光耀世界、温暖人间……OFDM技术作为4/5G物理层重要技术之一…

linux 内核被污染,导致Linux 4.20性能下降的STIBP已被Kernel 4.19系列内核移除

因为Linux Kernel 4.20默认启用了Spectre补丁STIBP&#xff0c;所以导致性能的下降&#xff0c;下降幅度甚至达到了50%&#xff0c;目前STIBP已经被移除&#xff0c;在最新发布的Linux Kernel 4.19.4、4.14.83内核当中已经移除了STIBP补丁。据称Linux Kernel 4.20就是启用了Spe…

a*算法matlab代码_NSGAII多目标优化算法讲解(附MATLAB代码)

小编今天为大家讲解NSGA-II多目标优化算法&#xff0c;提到多目标优化&#xff0c;大家可能第一个就想到NSGA-II算法&#xff0c;今天小编就带领大家解开NSGA-II的神秘面纱。NSGA-II全称是快速非支配排序遗传算法&#xff0c;这个算法的精髓体现在“快速非支配排序”这7个字上&…

octobercms 执行php代码_PHP7语言执行原理

常用的高级语言有很多种&#xff0c;根据运行的方式不同&#xff0c;大体分为两种&#xff1a;编译型语言和解释型语言。编译是指在应用源程序执行之前&#xff0c;就将程序源代码“翻译”成汇编语言&#xff0c;然后进一步根据软硬件环境编译成目标文件。一般称完成编译工作的…

convert.todatetime指定日期格式_JDK1.8新增日期时间类型

如果我们可以跟别人说&#xff1a;“我们在1502643933071见面&#xff0c;别晚了&#xff01;”那么就再简单不过了。但是我们希望时间与昼夜和四季有关&#xff0c;于是事情就变复杂了。Java1.0中包含了一个Date类&#xff0c;但是它的大多数方法已经在Java 1.1引入Calendar类…

facebook对话链接_如何应用防错原则,看看 Facebook 和 Gmail 是怎么做的

欢迎来到有言有料&#xff0c;让思考更有张力本文共 3873 字&#xff0c;预计阅读 10 分钟作者&#xff5c;Siddharth Gulati译者&#xff5c;张聿彤本文翻译已获得作者的正式授权(授权截图如下)在用户界面(UI)设计中&#xff0c;重要的是要注意最细微的细节&#xff0c;以使用…

模拟灰度传感器循迹的程序_PLC编程,实例讲解西门子PLC模拟量编程

给大伙分享的是关于西门子S7-300PLC模拟量方面的实例&#xff0c;包含了以下几个方面的要点&#xff1a;1、对变送器进行取值&#xff0c;并进行控制2、对模数功能块 FC105 进行调用3、对 AI 模块进行设置4、对 AI 量程块进行选择这个实例&#xff0c; 调试的是一个流量调节回路…