中年|因用了Insert into select语句,美女同事被开除了!( 二 )



INSERT INTO order_record SELECT*FROMorder_todayWHEREpay_success_time &lt "2020-03-08 00:00:00"
在navicat中运行迁移的sql,同时开另个一个窗口插入数据 , 模拟下单 。
中年|因用了Insert into select语句,美女同事被开除了!
本文插图

中年|因用了Insert into select语句,美女同事被开除了!
本文插图

中年|因用了Insert into select语句,美女同事被开除了!
本文插图

从上面可以发现一开始能正常插入 , 但是后面突然就卡住了 , 并且耗费了23s才成功 , 然后才能继续插入 。 这个时候已经迁移成功了 , 所以能正常插入了 。
# 出现的原因
在默认的事务隔离级别下:insert into order_record select * from order_today 加锁规则是:order_record表锁 , order_today逐步锁(扫描一个锁一个) 。
分析执行过程 。
通过观察迁移sql的执行情况你会发现order_today是全表扫描 , 也就意味着在执行insert into select from 语句时 , mysql会从上到下扫描order_today内的记录并且加锁 , 这样一来不就和直接锁表是一样了 。

这也就可以解释 , 为什么一开始只有少量用户出现支付失败 , 后续大量用户出现支付失败 , 初始化订单失败等情况 , 因为一开始只锁定了少部分数据 , 没有被锁定的数据还是可以正常被修改为正常状态 。 由于锁定的数据越来越多 , 就导致出现了大量支付失败 。 最后全部锁住 , 导致无法插入订单 , 而出现初始化订单失败 。
# 解决方案
最终的sqlINSERT INTO order_record SELECT*FROMorder_today FORCE INDEX (idx_pay_suc_time)WHEREpay_success_time &lt= "2020-03-08 00:00:00"
执行过程
# 总结
# 参考
https://blog.csdn.net/asdfsadfasdfsa/article/details/83030011
作者:不一样的科技宅 来源:juejin.im/post/5e670f0151882549274a65ef之前 , 给大家发过三份Java面试宝典 , 这次新增了一份 , 目前总共是四份面试宝典 , 相信在跳槽前一个月按照面试宝典准备准备 , 基本没大问题 。
《java面试宝典5.0》(初中级)
《350道Java面试题:整理自100+公司》(中高级)
《资深java面试宝典-视频版》(资深)
《Java[BAT]面试必备》(资深)
分别适用于初中级 , 中高级 , 资深级工程师的面试复习 。

内容包含java基础、javaweb、mysql性能优化、JVM、锁、百万并发、消息队列 , 高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级等等 。
获取方式:点“在看” , V信关注上述Java最全面试题库号并回复【面试】即可领取 , 更多精彩陆续奉上 。
看到这里 , 证明有所收获
必须点个在看支持呀 , 喵
java sql mysql insert select【来源:java进阶架构师】
声明:转载此文是出于传递更多信息之目的 。 若有来源标注错误或侵犯了您的合法权益 , 请作者持权属证明与本网联系 , 我们将及时更正、删除 , 谢谢 。邮箱地址:newmedia@xxcb.cn


推荐阅读