《MySQL鎖問題》要點:
本文介紹了MySQL鎖問題,希望對您有用。如果有疑問,可以聯系我們。
MySQL的鎖機制比擬簡單,不同的存儲引擎支持的不同的鎖機制.如:MyISAM和MEMORY存儲采用表級鎖(table-level locking),BDB存儲引擎采用的是頁面鎖(page-level locking),InnoDB存儲引擎既支持行級鎖(row-level locking),也支持表級鎖,但默認情況下采用的是行級鎖.
三種鎖的特性大致如下:
表級鎖:開銷小,加鎖快;不會出現死鎖,鎖定粒度大,發生鎖沖突的概率最高,并發粒度最低;
頁面鎖:開銷和加鎖時間介于表鎖和行鎖之間;會出現死鎖;鎖定粒度介于表鎖和行鎖之間;并發度一般;
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發讀也最高;
以上的特性主要是因為鎖模式決定的,在MySQL中鎖模式分為兩種:共享鎖(讀鎖)和獨占鎖(寫鎖).
1)以表級鎖來分析鎖模式:
當數據表已經被其中一個連接獲得了讀鎖,不會阻塞其他連接對這個表的讀哀求,但是如果有其他連接需要進行寫入,因為該表已經被設置讀鎖了,其他連接是不能獲得寫鎖的,需要等待所有的讀鎖釋放,它才能獲得寫鎖.
而如果一個表已經被一個連接獲得寫鎖,它會阻塞所有其他哀求對這個表的讀哀求和寫哀求,直至這個寫鎖被釋放.
2)以行級鎖來分析鎖模式:
鎖模式的原理跟上述描述的表級鎖是一樣的,只是它是根據行的粒度來設置鎖的.如果某一行被寫鎖了,它是不會阻塞其他連接對另外行的寫哀求的.
因為MySQL從5.5.5開始默認的存儲引擎是InnoDB,了解InnoDB的行級鎖對我們索引的優化也是一個非常大的贊助.那么MySQL是根據什么來設置行鎖的范圍的呢?
答案是索引,如果SQL執行計劃是依照某個索引進行的,那么他會根據該索引關聯到的行進行鎖定.如果SQL執行計劃沒有利用到索引,那么就是整個表鎖定了.表鎖是個很恐怖的東西,如果數據庫有大量更新操作的時候,那么數據庫的并發性能將大大降低.
所以索引不但是單存影響查詢的效率,在并發性能上也是一個大問題.
《MySQL鎖問題》是否對您有啟發,歡迎查看更多與《MySQL鎖問題》相關教程,學精學透。維易PHP學院為您提供精彩教程。