《MySQL鎖問(wèn)題》要點(diǎn):
本文介紹了MySQL鎖問(wèn)題,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
MySQL的鎖機(jī)制比擬簡(jiǎn)單,不同的存儲(chǔ)引擎支持的不同的鎖機(jī)制.如:MyISAM和MEMORY存儲(chǔ)采用表級(jí)鎖(table-level locking),BDB存儲(chǔ)引擎采用的是頁(yè)面鎖(page-level locking),InnoDB存儲(chǔ)引擎既支持行級(jí)鎖(row-level locking),也支持表級(jí)鎖,但默認(rèn)情況下采用的是行級(jí)鎖.
三種鎖的特性大致如下:
表級(jí)鎖:開銷小,加鎖快;不會(huì)出現(xiàn)死鎖,鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)粒度最低;
頁(yè)面鎖:開銷和加鎖時(shí)間介于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖;鎖定粒度介于表鎖和行鎖之間;并發(fā)度一般;
行級(jí)鎖:開銷大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)讀也最高;
以上的特性主要是因?yàn)殒i模式?jīng)Q定的,在MySQL中鎖模式分為兩種:共享鎖(讀鎖)和獨(dú)占鎖(寫鎖).
1)以表級(jí)鎖來(lái)分析鎖模式:
當(dāng)數(shù)據(jù)表已經(jīng)被其中一個(gè)連接獲得了讀鎖,不會(huì)阻塞其他連接對(duì)這個(gè)表的讀哀求,但是如果有其他連接需要進(jìn)行寫入,因?yàn)樵摫硪呀?jīng)被設(shè)置讀鎖了,其他連接是不能獲得寫鎖的,需要等待所有的讀鎖釋放,它才能獲得寫鎖.
而如果一個(gè)表已經(jīng)被一個(gè)連接獲得寫鎖,它會(huì)阻塞所有其他哀求對(duì)這個(gè)表的讀哀求和寫哀求,直至這個(gè)寫鎖被釋放.
2)以行級(jí)鎖來(lái)分析鎖模式:
鎖模式的原理跟上述描述的表級(jí)鎖是一樣的,只是它是根據(jù)行的粒度來(lái)設(shè)置鎖的.如果某一行被寫鎖了,它是不會(huì)阻塞其他連接對(duì)另外行的寫哀求的.
因?yàn)镸ySQL從5.5.5開始默認(rèn)的存儲(chǔ)引擎是InnoDB,了解InnoDB的行級(jí)鎖對(duì)我們索引的優(yōu)化也是一個(gè)非常大的贊助.那么MySQL是根據(jù)什么來(lái)設(shè)置行鎖的范圍的呢?
答案是索引,如果SQL執(zhí)行計(jì)劃是依照某個(gè)索引進(jìn)行的,那么他會(huì)根據(jù)該索引關(guān)聯(lián)到的行進(jìn)行鎖定.如果SQL執(zhí)行計(jì)劃沒(méi)有利用到索引,那么就是整個(gè)表鎖定了.表鎖是個(gè)很恐怖的東西,如果數(shù)據(jù)庫(kù)有大量更新操作的時(shí)候,那么數(shù)據(jù)庫(kù)的并發(fā)性能將大大降低.
所以索引不但是單存影響查詢的效率,在并發(fā)性能上也是一個(gè)大問(wèn)題.
《MySQL鎖問(wèn)題》是否對(duì)您有啟發(fā),歡迎查看更多與《MySQL鎖問(wèn)題》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/7662.html