最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql在update,非主鍵索引更新引起死鎖問題

 更新時(shí)間:2023年08月29日 10:08:23   作者:susu1083018911  
這篇文章主要介紹了mysql在update,非主鍵索引更新引起死鎖問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

mysql在update,非主鍵索引更新引起死鎖

1.mysql存儲(chǔ)引擎

Innodb:支持事務(wù),更新時(shí)采用行級(jí)鎖,并發(fā)性高

MyISAM:不支持事務(wù),更新時(shí)表鎖,并發(fā)性差

因此使用Innodb才會(huì)發(fā)生死鎖,從mysql5.6開始默認(rèn)引擎Innodb

2.update更新過程

行級(jí)鎖并不是直接鎖記錄,而是鎖索引,如果一條SQL語(yǔ)句用到了主鍵索引,mysql會(huì)鎖住主鍵索引;如果一條語(yǔ)句操作了非主鍵索引,mysql會(huì)先鎖住非主鍵索引,再鎖定主鍵索引。

反之:

  • 如果操作用到了主鍵索引會(huì)先在主鍵索引上加鎖,然后在其他索引上加鎖。
  • 如果沒有用到索引,則進(jìn)行全表掃描,鎖表。

當(dāng)where條件為非主鍵索引,執(zhí)行update時(shí),會(huì)經(jīng)過一下步驟:

1)先獲取非主鍵索引的行級(jí)鎖;

2)由數(shù)據(jù)庫(kù)基本原理可知,where條件為非主鍵索引時(shí),會(huì)發(fā)生回表查詢,進(jìn)而再獲得主鍵索引的行級(jí)鎖;

3)更新完畢,進(jìn)行事務(wù)提交。

根據(jù)上述步驟可知,對(duì)于非主鍵索引的update操作,其加鎖過程并非原子操作,而且是分別需要獲取不同索引的行級(jí)鎖,可能會(huì)產(chǎn)生死鎖:

假如:

一條update語(yǔ)句用到主鍵索引和非主鍵索引,則獲取鎖的順序是先獲取主鍵索引,再獲取非主鍵索引;

而同時(shí),另一條update語(yǔ)句只用到非主鍵索引,則獲取鎖的順序是先獲取非主鍵索引,再獲取主鍵索引,二者正好發(fā)生在步驟 1)和 2)中間,則會(huì)造成鎖。

3.解決方案

where條件加主鍵索引

先上鎖查詢查出來,在根據(jù)主鍵更新

逐條更新

行級(jí)鎖是鎖索引:

由于MySQL的行鎖是針對(duì)索引加的鎖,不是針對(duì)記錄加的鎖,所以雖然是訪問不同行的記錄,但是如果是使用相同的索引鍵,是會(huì)出現(xiàn)鎖沖突的

mysql批量update死鎖

項(xiàng)目使用了多線程,同時(shí)調(diào)用service中的update方法更新數(shù)據(jù),之前由于在update方法上加了synchronized做了線程同步,沒有出現(xiàn)mysql update死鎖的問題。

但是由于update更新耗時(shí)比較長(zhǎng),synchronized鎖住對(duì)象,導(dǎo)致調(diào)用service中的其他方法阻塞,效率地下,于是優(yōu)化synchronized,移到方法內(nèi)部的同步代碼段,然后雖然效率提高了,但是mysql總是出現(xiàn)死鎖的bug:

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found 
when trying to get lock; try restarting transaction; 

發(fā)生原因

T1:begin tran select * from table lock in share mode update table set column1='hello'

T2:begin tran select * from table lock in share mode update table set column1='world'

假設(shè) T1 和 T2 同時(shí)達(dá)到 select,T1 對(duì) table 加共享鎖,T2 也對(duì) table 加共享鎖,當(dāng) T1 的 select 執(zhí)行完,準(zhǔn)備執(zhí)行 update 時(shí),根據(jù)鎖機(jī)制,T1 的共享鎖需要升級(jí)到排他鎖才能執(zhí)行接下來的 update.在升級(jí)排他鎖前,必須等 table 上的其它共享鎖(T2)釋放,同理,T2 也在等 T1 的共享鎖釋放。于是死鎖產(chǎn)生了。

因此,當(dāng)sql發(fā)出一個(gè)update請(qǐng)求之后,數(shù)據(jù)庫(kù)會(huì)對(duì)表中的每條記錄加上共享鎖。

然后數(shù)據(jù)庫(kù)會(huì)根據(jù)where條件,將符合條件的記錄轉(zhuǎn)換為排他鎖(mysql innodb默認(rèn)對(duì)索引加鎖),我們的多個(gè)線程update時(shí),就出現(xiàn)了上面的情況,發(fā)生了死鎖。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql自動(dòng)增量備份的實(shí)例方法(本地備份與遠(yuǎn)程備份)

    mysql自動(dòng)增量備份的實(shí)例方法(本地備份與遠(yuǎn)程備份)

    mysql自動(dòng)增量備份的例子(本地備份與遠(yuǎn)程備份),有需要的朋友可以參考下
    2013-02-02
  • MySQL 根據(jù)條件多值更新的實(shí)現(xiàn)

    MySQL 根據(jù)條件多值更新的實(shí)現(xiàn)

    本文主要介紹了MySQL 根據(jù)條件多值更新的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Mysql中創(chuàng)建高性能索引詳解

    Mysql中創(chuàng)建高性能索引詳解

    這篇文章主要介紹了Mysql中創(chuàng)建高性能索引詳解,索引相信大家都聽說過,但是真正會(huì)用的又有幾人,平時(shí)工作中寫SQL真的會(huì)考慮到這條SQL如何能夠用上索引,如何能夠提升執(zhí)行效率,文本就來詳細(xì)解讀如何創(chuàng)建高性能索引,需要的朋友可以參考下
    2023-07-07
  • centOS7安裝MySQL數(shù)據(jù)庫(kù)

    centOS7安裝MySQL數(shù)據(jù)庫(kù)

    本文給大家簡(jiǎn)單介紹了如何在centOS7下安裝MySQL5.6數(shù)據(jù)庫(kù)的方法,以及一些注意事項(xiàng),希望對(duì)大家實(shí)用mysql能夠有所幫助
    2016-12-12
  • MySQL查看和修改時(shí)區(qū)的方法

    MySQL查看和修改時(shí)區(qū)的方法

    這篇文章主要給大家介紹了關(guān)于MySQL查看和修改時(shí)區(qū)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Oracle更換為MySQL遇到的問題及解決

    Oracle更換為MySQL遇到的問題及解決

    前段時(shí)間自行安裝MySQL8.0數(shù)據(jù)庫(kù),為數(shù)據(jù)庫(kù)去Oracle做準(zhǔn)備?,F(xiàn)在公司正規(guī)劃搭建MySQL集群。于是挑選兩個(gè)應(yīng)用,進(jìn)行改造測(cè)試,積累下經(jīng)驗(yàn)。
    2021-05-05
  • MySQL 數(shù)據(jù)庫(kù)設(shè)計(jì)復(fù)習(xí)筆記及項(xiàng)目實(shí)戰(zhàn)

    MySQL 數(shù)據(jù)庫(kù)設(shè)計(jì)復(fù)習(xí)筆記及項(xiàng)目實(shí)戰(zhàn)

    參考的數(shù)據(jù)庫(kù)文檔主要有:目前國(guó)內(nèi)的常見的PHP系統(tǒng)的數(shù)據(jù)庫(kù)
    2010-03-03
  • 在MySQL中存儲(chǔ)圖片的操作步驟

    在MySQL中存儲(chǔ)圖片的操作步驟

    之前遇到一個(gè)問題,就是在將項(xiàng)目遷移到別的服務(wù)器的時(shí)候出現(xiàn)圖片路徑不對(duì)的問題,因?yàn)榇娣艌D片的方式是在數(shù)據(jù)庫(kù)中存放圖片路徑,但是路徑前卻帶了域名,所以本文將給大家介紹在MySQL中存儲(chǔ)圖片的操作步驟,需要的朋友可以參考下
    2024-04-04
  • navicat連接mysql報(bào)錯(cuò)10060的解決辦法

    navicat連接mysql報(bào)錯(cuò)10060的解決辦法

    最近在學(xué)習(xí)中遇到了個(gè)小問題,現(xiàn)在將解決的辦法分享給同樣遇到這個(gè)問題的同學(xué),這篇文章主要給大家介紹了關(guān)于navicat連接mysql報(bào)錯(cuò)10060的解決辦法,需要的朋友可以參考下
    2023-03-03
  • MySQL子查詢用法實(shí)例分析

    MySQL子查詢用法實(shí)例分析

    這篇文章主要介紹了MySQL子查詢用法,結(jié)合實(shí)例形式對(duì)比分析了MySQL子查詢的設(shè)置技巧,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

通河县| 新化县| 宁远县| 海丰县| 邢台市| 壶关县| 内乡县| 上思县| 泗洪县| 龙山县| 利川市| 新郑市| 固镇县| 陵川县| 商河县| 龙井市| 金溪县| 芮城县| 公主岭市| 中牟县| 汉沽区| 凌云县| 莲花县| 拜城县| 华安县| 昌黎县| 黄平县| 内江市| 丘北县| 明溪县| 永寿县| 上栗县| 若尔盖县| 阿拉尔市| 镇安县| 壤塘县| 广汉市| 和顺县| 巩留县| 临安市| 高唐县|