通過實踐,我們來看看,對 MyISAM表進行寫操作時,會如之前說的那樣阻塞其他用戶對該表的讀寫操作嗎?
(先建立一張test表,存儲引擎為myisam,字段為id,name,并插入幾條數據,給test表中插入500w條數據用于測試)
****開始前的小知識點****
開始測試之前,我們需要知道一個小的知識點,因為接下來的測試速度太快,我們需要根據別的指標去判斷當時是否發生了阻塞,執行如下命令:
查看鎖的爭奪狀況
上圖中,箭頭標注的地方Table_locks_waited=280,它代表一共發生了280次不能立刻獲得鎖需要等待的情況,接下來的測試,我們會通過判斷測試前 Table_locks_waited的值和測試后Table_locks_waited的值得對比來判斷剛剛有沒有發生阻塞情況。
(1)A窗口在update時,立即去B窗口執行select,觀察:
初始值是280,測試完成后變成了281,說明發生了阻塞等待
(2)A窗口在update時,立即去B窗口執行insert,觀察:
初始值是281,測試完成后變成了282,說明發生了阻塞等待
(3)A窗口在update時,立即去B窗口執行delete,觀察:
初始值是282,測試完成后變成了283,說明發生了阻塞等待
(4)A窗口在update時,立即去B窗口執行update,觀察:
初始值是283,測試完成后變成了284,說明發生了阻塞等待
綜上,對 MyISAM表寫操作,則會阻塞其他用戶對該表的讀寫操作,當一個線程獲得對一個表的寫鎖后對表進行更新操作,其他線程的讀、寫操作(增刪改查)都會等待,直到鎖被釋放為止。