****MYISAM存儲引擎下讀鎖和寫鎖是互斥的****
MYISAM存儲引擎下讀鎖和寫鎖是互斥的,即當(dāng)兩個請求同時到達的情況下,一個申請寫鎖,一個申請讀鎖,MYISAM存儲引擎只能設(shè)置寫鎖或者讀鎖,不能既設(shè)置寫鎖又設(shè)置讀鎖。
****MYISAM存儲引擎下寫鎖的優(yōu)先級比較高****
缺省的情況下,同一時間點上,同時到達兩個進程,分別申請讀鎖和寫鎖的情況,MYSQL會優(yōu)先給寫鎖。
而且,如果讀請求先到鎖等待隊列里面排隊,寫請求后到鎖等待隊列的話,也是優(yōu)先給寫鎖,寫鎖處理完畢才給讀鎖。這是缺省情況下,mysql認(rèn)為寫比讀更重要,所以做出的這種分配機制。
接下來我們嘗試自己去觀察下,事實是不是這樣的吧?
A窗口先運行一個時間比較長的update操作,然后立即去執(zhí)行B窗口的select操作,然后立即再去C窗口執(zhí)行update操作。(A窗口運行的時候,B窗口的select先進入鎖等待隊列,C窗口的update后進入鎖等待隊列,觀察在鎖等待隊列中select 先到,update后到的情況下,誰先執(zhí)行?)

由圖中我們可以看到,在進入鎖等待隊列時,select先到隊列等待的但卻是最后執(zhí)行的,update后到隊列但卻是先執(zhí)行的,因此,可以說明,myisam 下默認(rèn)對寫的優(yōu)先級比較高。
****適用的場景****
Myisam引擎這種缺省情況下的機制,會有一個比較嚴(yán)重的問題,那就是對于大量的更新和查詢操作的應(yīng)用,因為寫操作的優(yōu)先級大于讀操作,那就可能造成讀鎖很難獲得讀鎖,一直阻塞在那邊,直到寫操作執(zhí)行完畢,因此,myisam表只適合讀多寫少的情況下。