只能獲取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.pswp.cn/news/529168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529168.shtml
英文地址,請注明出處:http://en.pswp.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…