内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

MySQL中如何書寫update避免表鎖

MySQL中如何書寫update避免表鎖,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

青岡網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,青岡網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為青岡近千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的青岡做網(wǎng)站的公司定做!

今天,我來說另外一個(gè)面試題。為什么推薦 MySQL 的 update 語句中 where 條件要有主鍵?

看到這個(gè)問題的朋友,我相信不少人有疑問,我 where 不加主鍵還不能更新了?

不是的,能更新,也能使用。但是我不建議你們這樣做。因?yàn)槲覀兇蠖鄶?shù)人使用 MySQL 都使用的是 innodb 存儲(chǔ)引擎,它是支持事務(wù)的。如果你的 where 條件不加主鍵,那么 innodb 的行級(jí)鎖就可能變成表級(jí)鎖。如果升級(jí)為表級(jí)鎖,那么并發(fā)性就將大打折扣了。

行鎖升級(jí)為表鎖與事務(wù)的隔離級(jí)別有關(guān),因?yàn)槭聞?wù)的隔離性是靠加鎖來實(shí)現(xiàn)的,而加鎖不當(dāng)勢(shì)必會(huì)影響并發(fā)。

不一樣的鎖,支持的并發(fā)也是不一樣的。而最終加什么樣的鎖,與索引也有莫大的關(guān)系,因此,可以說采用什么樣的索引決定了支持多少并發(fā)。

常用的索引有三類:主鍵、唯一索引、普通索引。主鍵我就不再細(xì)說,自帶最高效的索引屬性;唯一索引指的是該屬性值重復(fù)率為 0,一般可作為業(yè)務(wù)主鍵,例如訂單號(hào);普通索引 與前者不同的是,屬性值的重復(fù)率大于 0,不能作為唯一指定條件,例如購買用戶的姓名。今天我主要想說的是“普通索引對(duì)并發(fā)的影響”。

沒有索引的情況,我就不說了,那對(duì)并發(fā)來說肯定是災(zāi)難,死鎖估計(jì)是常有的事。

為什么我推薦 update 中 where 條件加入主鍵呢?

因?yàn)橹麈I是唯一索引,你用其他唯一索引也可以,但是一般的表,可能只有主鍵才是唯一的。所以,我建議你更新的時(shí)候,記住加上主鍵就行了。

你只需要記住主鍵和唯一索引是行鎖,其他索引并不一定是行鎖,很可能是表鎖。這樣,死鎖的概率就非常的高,并發(fā)也就隨之下降。

下面我們通過一個(gè)簡單的例子來看一下,普通索引的情況。

相關(guān)建表語句,索引,和數(shù)據(jù)如下所示:

MySQL中如何書寫update避免表鎖

然后取消事務(wù)自動(dòng)提交 set autocommit = off;

當(dāng)我們表里面創(chuàng)建時(shí)間重復(fù)率比較高的時(shí)候。分別開啟兩個(gè)窗口,兩個(gè)事務(wù)。

MySQL中如何書寫update避免表鎖

為了演示,你可以把數(shù)據(jù)量加多點(diǎn),比如 03-01 和 03-02 的數(shù)據(jù)各 10 萬條。

依次執(zhí)行兩個(gè)窗口中的 SQL,你會(huì)發(fā)現(xiàn),其中一個(gè)窗口中的更新失敗了。提示:

MySQL中如何書寫update避免表鎖

看似這兩個(gè)事務(wù)不互相干,但是在其中一個(gè)事務(wù)中更新自己鎖定的數(shù)據(jù)失敗后,應(yīng)該能說明在此時(shí)引發(fā)了表鎖。這是在非主鍵索引或者說是唯一索引,并且索引數(shù)據(jù)重復(fù)量比較高的情況下,你的更新發(fā)生量表鎖。并發(fā)能力就會(huì)大大下降!

你們可以試一下,如果此時(shí)使用主鍵或唯一索引會(huì)不會(huì)這樣。

在我們的電商系統(tǒng)中,這樣的代碼并不少。在一些熱門商品和秒殺、優(yōu)惠、打折等活動(dòng)中經(jīng)常會(huì)發(fā)生一些莫名其妙的異常,導(dǎo)致用戶體驗(yàn)大打折扣。

上面的測試數(shù)據(jù),你把它們?nèi)縿h除,然后再新增一些數(shù)據(jù),這些數(shù)據(jù)中在 create_time 重復(fù)率為 0 的情況下,你會(huì)發(fā)現(xiàn)兩個(gè)事務(wù)就都能成功了。這說明它們這時(shí)用的應(yīng)該是行級(jí)鎖,效率更高。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

本文題目:MySQL中如何書寫update避免表鎖
文章鏈接:http://m.rwnh.cn/article2/jipeoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)站收錄、微信公眾號(hào)、網(wǎng)站維護(hù)、建站公司

廣告

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

網(wǎng)站托管運(yùn)營
滨海县| 东乌| 安龙县| 聊城市| 锦州市| 金塔县| 岱山县| 古田县| 贺兰县| 长宁县| 盱眙县| 德惠市| 岑溪市| 闽清县| 工布江达县| 庄浪县| 宝坻区| 宁晋县| 花莲县| 杂多县| 茂名市| 彭泽县| 临江市| 禄劝| 紫金县| 巴彦县| 金平| 大兴区| 黔江区| 广东省| 报价| 镇巴县| 鄂托克前旗| 元谋县| 宜宾县| 博爱县| 安吉县| 梓潼县| 蒙自县| 红桥区| 松溪县|