**订单记录表**
`CREATE TABLE order_record like order_today;`
**今日订单表数据**
![图片](https://img-blog.csdnimg.cn/img_convert/fbaecdeaa0722e24182a5a324fc93447.png)
模拟迁移
把8号之前的数据都迁移到`order_record`表中去。
INSERT INTO order_record SELECT
*
FROM
order_today
WHERE
pay_success_time < ‘2020-03-08 00:00:00’;
在navicat中运行迁移的sql,同时开另个一个窗口插入数据,模拟下单
![图片](https://img-blog.csdnimg.cn/img_convert/1666d25cdcd888fdd94e6c273fbaff59.png)
![图片](https://img-blog.csdnimg.cn/img_convert/ae69402cd680e2609c158fa9540fcfba.png)
从上面可以发现一开始能正常插入,但是后面突然就卡住了,并且耗费了23s才成功,然后才能继续插入。这个时候已经迁移成功了,所以能正常插入了。
#### 出现的原因
在默认的事务隔离级别下:`insert into order_record select * from order_today` 加锁规则是:`order_record`表锁,`order_today`逐步锁(扫描一个锁一个)。
分析执行过程。
![图片](https://img-blog.csdnimg.cn/img_convert/dcb61852754ca42a7231c92e8b9155a3.png)
通过观察**迁移sql**的执行情况你会发现`order_today`是全表扫描,也就意味着在执行`insert into select from` 语句时,mysql会从上到下扫描`order_today`内的记录并且加锁,这样一来不就和直接锁表是一样了。
这也就可以解释,为什么一开始只有少量用户出现支付失败,后续大量用户出现支付失败,初始化订单失败等情况。
因为一开始只锁定了少部分数据,没有被锁定的数据还是可以正常被修改为正常状态。
由于锁定的数据越来越多,就导致出现了大量支付失败。最后全部锁住,导致无法插入订单,而出现初始化订单失败。
#### 解决方案
由于查询条件会导致`order_today`全表扫描,什么能避免全表扫描呢。
很简单嘛,给`pay_success_time`字段添加一个`idx_pay_suc_time`索引就可以了。
由于走索引查询,就不会出现扫描全表的情况而锁表了,只会锁定符合条件的记录。
关于 MySQL 索引的详细用法有实战,大家可以看我以前的索引优化系列的文章。
最终的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’;
**执行过程**
![图片](https://img-blog.csdnimg.cn/img_convert/14f6c06aa35624bbea3298d3e911a388.png)
#### 总结
使用`insert into tablA select * from tableB`语句时,一定要确保`tableB`后面的`where`,`order`或者其他条件,都需要有对应的**索引**,来避免出现`tableB`全部记录被锁定的情况。
**文末福利**
**【可以加小新老师vx免费领取JAVA全套学习资料哦,基础,进阶,高阶都有】**
**![](https://img-blog.csdnimg.cn/daec72a1052d468090cc9db8a95a2dd9.png)**
**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7**
**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/86d62ecfab38734a43835bd3af9b7431.png)
![img](https://img-blog.csdnimg.cn/img_convert/6bbecf4a9cc9fcbf45c621ae7d0a1f21.png)
![img](https://img-blog.csdnimg.cn/img_convert/43c176323a44b12aca13fb346ca5ecca.png)
![img](https://img-blog.csdnimg.cn/img_convert/2a02e436a8f2d8bad419ed6b812591ab.png)
![img](https://img-blog.csdnimg.cn/img_convert/d5c40eb4860282100c693beae60cc452.png)
![img](https://img-blog.csdnimg.cn/img_convert/9e2327e86130366bfb06f03bf460b446.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**