Mysql數據庫鎖模塊之MyISAM與InnoDB關於鎖方面的區別

MyISAM與InnoDB關於鎖方面的區別是什麼?

MyISAM默認用的是表級鎖,不支持行級鎖

InnoDB默認用的是行級鎖,也支持表級鎖

注:MyISAM與InnoDB存儲引擎都是針對某張具體表而言的,而非數據庫級別的


MyISAM表級鎖

首先準備兩個數據庫的session(會話),這裏用sessionA和sessionB來表示,來對同一張表進行操作


先上讀鎖(默認共享鎖)情況:

首先sessionA先去執行一個select查詢操作:


情況1:此時sessionB去執行一個更改數據(增、刪、改)的操作,會發現sessionA的查詢操作未執行完之前,sessionB的更改操作是等待狀態,無法執行的(不再支持上排它鎖)




情況2:此時sessionB去執行一個select查詢操作,會發現sessionA的查詢操作未執行完之前,sessionB的查詢操作是不受影響的,獨立執行的,這就是爲什麼讀鎖也叫默認共享鎖(支持上其他共享鎖)



先上寫鎖(排他鎖)情況:

首先sessionA先去執行一個select查詢操作:


此時sessionB去執行一個查詢操作或者更改數據(增、刪、改)的操作,會發現sessionA的查詢操作未執行完之前,sessionB的操作是等待狀態,無法執行的(不再支持上其他鎖)



顯示的手動對一個表的讀操作加讀鎖、釋放鎖:


加讀/寫鎖:lock tables 表名 read/write;

釋放鎖:unlock tables;

1

2

InnoDB行級鎖

首先InnoDB採用的是二段鎖

二段鎖:加鎖和解鎖是分別來執行的,對一個事務裏的一批sql操作加鎖,等到事務提交的時候,再進行所有解鎖


要演示這個先將兩個session的事務自動提交關閉


show variables like 'autocommit';#查看當前是否開啓自動提交事務,默認開啓

set autocommit = 0;#關閉默認提交,關閉之後,事務需要手動commit,並且設置只對當前session有效

commit;#提交事務



演示InnoDB爲行級鎖,sessionA和sessionB就對同一張表的同一行進行操作


先對sessionA執行select操作,但是不commit,然後對sessionB進行update/insert/delete操作,發現sessionB竟然能夠執行成功,這不符合在行級別加了共享鎖之後,不能再加排它鎖的規律,其實這裏需要注意,這裏sessionA的select操作並未加共享讀鎖,這是InnoDB對select進行了優化(非阻塞select),這裏需要顯示的加上共享讀鎖


select......lock in share mode;//加共享鎖

1

此時再對sessionA執行select操作,但是不commit,然後對sessionB進行update/insert/delete操作,發現sessionB不能夠執行需要等待,當sessionA執行commit之後,釋放鎖,此時sessionB方可執行


如果sessionA和sessionB操作的是不同行,不論sessionA是加的共享鎖還是排它鎖,都不影響sessionB的獨立操作,因此也證明InnoDB默認行級鎖


InnoDB中其他鎖情況和MyISAM中也符合相同規律,不同的就是InnoDB默認行級別,MyISAM有且只有表級別


InnoDB在什麼情況下行鎖會升級爲表鎖?鄭州不孕不育 醫院:http://jbk.39.net/yiyuanfengcai/tsyl_zztjyy/3030/

當操作sql沒有走索引(沒有走索引或者索引失效),此時就會走表鎖,兩個數據庫session分別操作同一張表中不同的數據行,還是會受共享鎖和排它鎖之間兼容性的限制

鄭州不孕不育治療:http://www.zzfkyy120.com/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章