欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解mysql各種鎖

 更新時(shí)間:2021年12月06日 16:59:19   作者:奔跑的蝸牛...  
大家好,本篇文章主要講的是深入理解mysql各種鎖,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

鎖的概述

鎖是計(jì)算機(jī)協(xié)調(diào)多個(gè)進(jìn)程或線程并訪問某一資源的機(jī)制

在數(shù)據(jù)庫中,除傳統(tǒng)的計(jì)算機(jī)資源(如cpu、RAM、I/O等)的爭(zhēng)用以外,數(shù)據(jù)也是一種供許多用戶共享的資源,如果保證數(shù)據(jù)并發(fā)訪問的一致性,有效性是所有數(shù)據(jù)庫必須解決的一個(gè)問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個(gè)重要因素,從這個(gè)角度來說,鎖對(duì)數(shù)據(jù)庫而言顯得尤其重要,也更加復(fù)雜

鎖分類

對(duì)數(shù)據(jù)庫操作的粒度分

表鎖:
	操作時(shí),會(huì)鎖定整個(gè)表
行鎖:
	操作時(shí),會(huì)鎖定當(dāng)前操作行

對(duì)數(shù)據(jù)操作的類型分

讀鎖(共享鎖):
	針對(duì)同一份數(shù)據(jù),多個(gè)讀操作可以同時(shí)進(jìn)行而不會(huì)相互影響
寫鎖(排它鎖):
	當(dāng)操作沒有完成之前,它會(huì)阻斷其他寫鎖和讀鎖

mysql鎖

相對(duì)其他數(shù)據(jù)庫而言,Mysql的鎖機(jī)制比較簡(jiǎn)單,其最顯著的特點(diǎn)是不同的存儲(chǔ)引擎支持不同的鎖機(jī)制。

不同存儲(chǔ)引擎支持鎖級(jí)別

存儲(chǔ)引擎 表級(jí)鎖 行級(jí)鎖 頁面鎖
MyISAM 支持 不支持 不支持
InnoDB 支持 支持 不支持
MEMORY 支持 不支持 不支持
BDB 支持 不支持 支持

鎖介紹

很難籠統(tǒng)說哪種鎖更好,需要根據(jù)特定的應(yīng)用場(chǎng)景來分析哪種鎖更合適。

鎖類型 特點(diǎn)
表級(jí)鎖 偏向MyISAM存儲(chǔ)引擎,開銷小,加鎖快;不會(huì)出現(xiàn)死鎖;鎖定粒度大,發(fā)送鎖沖突的概率最高,并發(fā)度最低。
行級(jí)鎖 偏向InnoDB存儲(chǔ)引擎,開銷大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
頁面鎖 開銷和加鎖時(shí)間介于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖;鎖定粒度介于表鎖和行鎖之間,并發(fā)度一般。

MyISAM表鎖

如何添加表鎖

MyISAM在執(zhí)行查詢語句(select)前,會(huì)自動(dòng)給涉的所有表加鎖,在執(zhí)行更新操作(update、delete、insert等)前,會(huì)自動(dòng)給涉及的表加寫鎖,這個(gè)過程并不需要用戶干預(yù),因此,用戶一般不需要直接使用LOCK TABLE命令給MyISAM表顯示加鎖

加解鎖

加讀鎖:
	lock table table_name read; 
	---解鎖 unlock tables;
加寫鎖:
	lock table table_name write;
	添加寫鎖當(dāng)前會(huì)話可以讀寫操作,別的會(huì)話會(huì)處于阻塞(等待)狀態(tài)
讀鎖限制寫,寫鎖限制讀寫

鎖競(jìng)爭(zhēng)

1、對(duì)MyISAM表的讀操作,不會(huì)阻塞其他用戶對(duì)同一表的讀請(qǐng)求,但會(huì)阻塞對(duì)同一表的寫請(qǐng)求;
2、對(duì)MyISAM的寫操作,則會(huì)阻塞其他用戶對(duì)表一表的讀和寫操作;
3、MyISAM鎖調(diào)度是寫優(yōu)先。
	不適合作為主表,寫鎖后其他線程大量的更新會(huì)使查詢很難得到鎖,可能會(huì)造成永遠(yuǎn)阻塞。

鎖的使用情況

查看鎖的使用情況
	show open tables;
查看表的鎖定情況
	show status like 'table_locks%';
		Table_locks_immediate:可以獲取表級(jí)鎖的次數(shù),每立即獲取鎖,值加1
		Table_locks_waited:不能立即獲取鎖需要等待的次數(shù),每等待一次,值加1,可以判斷比較嚴(yán)重的表級(jí)鎖爭(zhēng)用情況
	

InnoDB鎖

InnoDB與MyISAM的最大不同有亮點(diǎn):一是支持事務(wù);二是采用行級(jí)鎖

行鎖

共享鎖:
	又稱讀鎖,多個(gè)事務(wù)可以共享一把鎖,但是只能讀,不能寫
排它鎖:
	又稱寫鎖,鎖不共用,獲取不到鎖的事務(wù)不能進(jìn)行讀寫操作
如果進(jìn)行update、delete和insert 語句,innoDB會(huì)自動(dòng)給涉及數(shù)據(jù)集加排它鎖
對(duì)不同的select語句不會(huì)添加任何鎖
顯示的給查詢添加鎖
	添加共享鎖:
		select * from table_name where ... Lock IN SHARE MODE
	添加排它鎖:
		select * from table_name where ... FOR UPDATE

鎖升級(jí)

索引失效,行鎖升級(jí)表鎖
where后面沒索引也升級(jí)為表鎖

間隙鎖

InnoDB會(huì)對(duì)間隙不存在的數(shù)據(jù)也會(huì)加鎖,稱之為間隙鎖

鎖爭(zhēng)用

show status like 'innodb_row_lock%';
	Innodb_row_lock_current_waits當(dāng)前正在等待鎖的數(shù)量
	Innodb_row_lock_time 鎖定的總時(shí)長
	Innodb_row_lock_time_avg 鎖定的平均時(shí)長
	Innodb_row_lock_time_max 鎖定的最大時(shí)長
	Innodb_row_lock_waits 系統(tǒng)啟動(dòng)到現(xiàn)在總共等待次數(shù)

總結(jié)

innoDB存儲(chǔ)引擎實(shí)現(xiàn)了行鎖,雖然鎖定機(jī)制的實(shí)現(xiàn)方面帶來了性能消耗可能比較表鎖會(huì)更高些,但是在整體并發(fā)處理能力方面要遠(yuǎn)優(yōu)于MyISAM表鎖,當(dāng)系統(tǒng)并發(fā)比較高的時(shí)候,InnoDB的整體性能和MyISAM會(huì)有比較明顯的優(yōu)勢(shì)

優(yōu)化建議

盡可能讓所有數(shù)據(jù)檢索都能通過索引來完成,避免無索引行鎖升級(jí)為表鎖
合理設(shè)計(jì)索引,盡量縮小鎖的范圍
盡可能減少索引條件,及索引范圍,避免間隙鎖
盡量控制事務(wù)大小,減少鎖定資源量和時(shí)間的長度
盡可能使用低級(jí)別事務(wù)隔離(需要業(yè)務(wù)能滿足需求)

到此這篇關(guān)于深入理解mysql各種鎖的文章就介紹到這了,更多相關(guān)mysql鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • windows下mysql 8.0.15 詳細(xì)安裝使用教程

    windows下mysql 8.0.15 詳細(xì)安裝使用教程

    這篇文章主要為大家詳細(xì)介紹了windows下mysql 8.0.15 詳細(xì)安裝使用教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • MySQL中or、in、union與索引優(yōu)化詳析

    MySQL中or、in、union與索引優(yōu)化詳析

    這篇文章主要給大家介紹了關(guān)于MySQL中or、in、union與索引優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • MySQL索引之聚集索引介紹

    MySQL索引之聚集索引介紹

    在MySQL中,InnoDB引擎表是(聚集)索引組織表(clustered index organize table),而MyISAM引擎表則是堆組織表(heap organize table)
    2015-12-12
  • mysql性能監(jiān)控工具Innotop簡(jiǎn)介及配置

    mysql性能監(jiān)控工具Innotop簡(jiǎn)介及配置

    INNOTOP是一個(gè)通過文本模式顯示MySQL和InnoDB的監(jiān)測(cè)工具。INNOTOP是用PERL語言寫成的,這使它能更加靈活的使用在各種操作平臺(tái)之上,它能詳細(xì)的的監(jiān)控出當(dāng)前MYSQL和INNODB運(yùn)行的狀態(tài),以DBA根據(jù)結(jié)果,可以合理的優(yōu)化MYSQL,讓MYSQL更穩(wěn)定更高效的運(yùn)行。
    2014-08-08
  • 解析SQL Server 視圖、數(shù)據(jù)庫快照

    解析SQL Server 視圖、數(shù)據(jù)庫快照

    在程序開發(fā)過程中,任何一個(gè)項(xiàng)目都離不開數(shù)據(jù)庫,這篇文章給大家詳細(xì)介紹SQL Server 視圖、數(shù)據(jù)庫快照相關(guān)內(nèi)容,需要的朋友可以參考下
    2015-08-08
  • 千萬級(jí)用戶系統(tǒng)SQL調(diào)優(yōu)實(shí)戰(zhàn)分享

    千萬級(jí)用戶系統(tǒng)SQL調(diào)優(yōu)實(shí)戰(zhàn)分享

    這篇文章主要介紹了千萬級(jí)用戶系統(tǒng)SQL調(diào)優(yōu)實(shí)戰(zhàn)分享,用戶日活百萬級(jí),注冊(cè)用戶千萬級(jí),而且若還沒有進(jìn)行分庫分表,則該DB里的用戶表可能就一張,單表上千萬的用戶數(shù)據(jù),下面我們就來學(xué)習(xí)如何讓優(yōu)化,需要的朋友可以參考一下
    2022-03-03
  • MYSQL數(shù)據(jù)庫表結(jié)構(gòu)優(yōu)化方法詳解

    MYSQL數(shù)據(jù)庫表結(jié)構(gòu)優(yōu)化方法詳解

    這篇文章主要介紹了MYSQL數(shù)據(jù)庫表結(jié)構(gòu)優(yōu)化方法,總結(jié)分析了mysql針對(duì)表結(jié)構(gòu)優(yōu)化的數(shù)據(jù)類型選擇、范式化操作、表的拆分等相關(guān)使用技巧,需要的朋友可以參考下
    2019-08-08
  • mysql 如何使用JSON_EXTRACT() 取json值

    mysql 如何使用JSON_EXTRACT() 取json值

    這篇文章主要介紹了mysql如何使用JSON_EXTRACT() 取json值的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • mysql8.0.21安裝教程圖文詳解

    mysql8.0.21安裝教程圖文詳解

    這篇文章主要介紹了mysql8.0.21安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 查看MySQL的錯(cuò)誤日志的方法

    查看MySQL的錯(cuò)誤日志的方法

    我們經(jīng)常在運(yùn)行MySQL時(shí)會(huì)出一些錯(cuò)誤,也經(jīng)常被這些錯(cuò)誤搞得暈頭轉(zhuǎn)向。當(dāng)然解決這些問題的首要任務(wù)是找到日志信息。
    2010-07-07

最新評(píng)論