解決線(xiàn)上數(shù)據(jù)庫(kù)死鎖,就是這么簡(jiǎn)單!

2021-02-26    分類(lèi): 網(wǎng)站建設(shè)

前幾天,線(xiàn)上發(fā)生了一次數(shù)據(jù)庫(kù)死鎖問(wèn)題,這一問(wèn)題前前后后排查了比較久的時(shí)間,這個(gè)過(guò)程中自己也對(duì)數(shù)據(jù)庫(kù)的鎖機(jī)制有了更深的理解。

updateFundStreamId 執(zhí)行的時(shí)候使用到的是 PRIMARY 索引。

updateStatus 執(zhí)行的時(shí)候使用到的是 idx_seller_transNo 索引。

通過(guò)執(zhí)行計(jì)劃,我們發(fā)現(xiàn) updateStatus 其實(shí)是有兩個(gè)索引可以用的,執(zhí)行的時(shí)候真正使用的是 idx_seller_transNo 索引。這是因?yàn)?MySQL 查詢(xún)優(yōu)化器是基于代價(jià)(cost-based)的查詢(xún)方式。

因此,在查詢(xún)過(guò)程中,最重要的一部分是根據(jù)查詢(xún)的 SQL 語(yǔ)句,依據(jù)多種索引,計(jì)算查詢(xún)需要的代價(jià),從而選擇最優(yōu)的索引方式生成查詢(xún)計(jì)劃。

我們查詢(xún)執(zhí)行計(jì)劃是在死鎖發(fā)生之后做的,事后查詢(xún)的執(zhí)行計(jì)劃和發(fā)生死鎖那一刻的索引使用情況并不一定是相同的。

但是,我們結(jié)合死鎖日志,也可以定位到以上兩條 SQL 語(yǔ)句執(zhí)行的時(shí)候使用到的索引。

即 updateFundStreamId 執(zhí)行的時(shí)候使用到的是 PRIMARY 索引,updateStatus 執(zhí)行的時(shí)候使用到的是 idx_seller_transNo 索引。

有了以上這些已知信息,我們就可以開(kāi)始排查死鎖原因及其背后的原理了。

通過(guò)分析死鎖日志,再結(jié)合我們的代碼以及數(shù)據(jù)庫(kù)建表語(yǔ)句,我們發(fā)現(xiàn)主要問(wèn)題出在我們的 idx_seller_transNo 索引上面:

  1. KEY `idx_seller_transNo` (`seller_id`,`fund_transfer_order_no`(20)) 

索引創(chuàng)建語(yǔ)句中,我們使用了前綴索引,為了節(jié)約索引

    那么為什么 fund_transfer_order_no 的前 20 位相同會(huì)導(dǎo)致死鎖呢?

    加鎖原理

    我們就拿本次的案例來(lái)看一下 MySQL 數(shù)據(jù)庫(kù)加鎖的原理是怎樣的,本文的死鎖背后又發(fā)生了什么。

    我們?cè)跀?shù)據(jù)庫(kù)上模擬死鎖場(chǎng)景,執(zhí)行順序如下:

    我們知道,在 MySQL 中,行級(jí)鎖并不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種:

    • 如果一條 SQL 語(yǔ)句操作了主鍵索引,MySQL 就會(huì)鎖定這條主鍵索引。
    • 如果一條語(yǔ)句操作了非主鍵索引,MySQL 會(huì)先鎖定該非主鍵索引,再鎖定相關(guān)的主鍵索引。

    主鍵索引的葉子節(jié)點(diǎn)存的是整行數(shù)據(jù)。在 InnoDB 中,主鍵索引也被稱(chēng)為聚簇索引(Clustered Index)。

    非主鍵索引的葉子節(jié)點(diǎn)的內(nèi)容是主鍵的值,在 InnoDB 中,非主鍵索引也被稱(chēng)為非聚簇索引(Secondary Index)。

    所以,本文的示例中涉及到的索引結(jié)構(gòu)(索引是 B+ 樹(shù),簡(jiǎn)化成表格了)如圖:

    死鎖的發(fā)生與否,并不在于事務(wù)中有多少條 SQL 語(yǔ)句,死鎖的關(guān)鍵在于:兩個(gè)(或以上)的 Session 加鎖的順序不一致。

    當(dāng)前標(biāo)題:解決線(xiàn)上數(shù)據(jù)庫(kù)死鎖,就是這么簡(jiǎn)單!
    鏈接分享:http://m.kartarina.com/news29/103129.html

    成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)品牌網(wǎng)站制作營(yíng)銷(xiāo)型網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈網(wǎng)站導(dǎo)航網(wǎng)站營(yíng)銷(xiāo)

    廣告

    聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

    營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
    主站蜘蛛池模板: 无码AV天堂一区二区三区| 日韩爆乳一区二区无码| 无码熟妇αⅴ人妻又粗又大| 国产精品午夜无码体验区| 日产无码1区2区在线观看| 久久无码专区国产精品s| 国产精品无码久久av| 免费人妻无码不卡中文字幕系| 精品久久久久久无码中文野结衣 | 久久AV高潮AV无码AV| 亚洲成A人片在线观看无码3D| 日韩一区二区三区无码影院| 国产真人无码作爱免费视频| 亚洲youwu永久无码精品| 性无码一区二区三区在线观看| 国产成人无码aa精品一区| 日日摸夜夜添无码AVA片| 无码国内精品久久人妻| 亚洲中文字幕无码一区| 黑人无码精品又粗又大又长 | 国产精品99精品无码视亚| 免费A级毛片无码A∨男男| 亚洲a∨无码精品色午夜| 18禁无遮挡无码国产免费网站| 野花在线无码视频在线播放| 国产成人无码午夜福利软件| 日韩放荡少妇无码视频| 无码高潮爽到爆的喷水视频app| 无码精品尤物一区二区三区| 免费A级毛片无码视频| 亚洲Aⅴ无码专区在线观看q| 丰满熟妇乱又伦在线无码视频| 中文成人无码精品久久久不卡 | 亚洲AV无码一区二区三区系列| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻系列av无码一区二区 | 亚洲精品一级无码鲁丝片| 国产裸模视频免费区无码| 国产精品无码久久久久久久久久| 无码人妻一区二区三区av| 国产成人精品无码专区| HEYZO无码综合国产精品|