說兩個(gè)維度:
共享鎖(簡稱S鎖)和排他鎖(簡稱X鎖)
讀鎖是共享的,可以通過lock in share mode實(shí)現(xiàn),這時(shí)候只能讀不能寫。
寫鎖是排他的,它會阻塞其他的寫鎖和讀鎖。從顆粒度來區(qū)分,可以分為表鎖和行鎖兩種。
表鎖和行鎖
表鎖會鎖定整張表并且阻塞其他用戶對該表的所有讀寫操作,比如alter修改表結(jié)構(gòu)的時(shí)候會鎖表。
行鎖又可以分為樂觀鎖和悲觀鎖
悲觀鎖可以通過for update實(shí)現(xiàn)
樂觀鎖則通過版本號實(shí)現(xiàn)。
兩個(gè)維度結(jié)合來看:
共享鎖(行鎖):Shared Locks
讀鎖(s鎖),多個(gè)事務(wù)對于同一數(shù)據(jù)可以共享訪問,不能操作修改
使用方法:
加鎖:SELECT * FROM table WHERE id=1 LOCK IN SHARE MODE
釋鎖:COMMIT/ROLLBACK
排他鎖(行鎖):Exclusive Locks
寫鎖(X鎖),互斥鎖/獨(dú)占鎖,事務(wù)獲取了一個(gè)數(shù)據(jù)的X鎖,其他事務(wù)就不能再獲取該行的讀鎖和寫鎖(S鎖、X鎖),只有獲取了該排他鎖的事務(wù)是可以對數(shù)據(jù)行進(jìn)行讀取和修改
使用方法:DELETE/ UPDATE/ INSERT -- 加鎖
SELECT * FROM table WHERE ... FOR UPDATE -- 加鎖
COMMIT/ROLLBACK -- 釋鎖
意向共享鎖(IS)
一個(gè)數(shù)據(jù)行加共享鎖前必須先取得該表的IS鎖,意向共享鎖之間是可以相互兼容的 意向排它鎖(IX) 一個(gè)數(shù)據(jù)行加排他鎖前必須先取得該表的IX鎖,意向排它鎖之間是可以相互兼容的 意向鎖(IS、IX)是InnoDB引擎操作數(shù)據(jù)之前自動(dòng)加的,不需要用戶干預(yù); 意義: 當(dāng)事務(wù)操作需要鎖表時(shí),只需判斷意向鎖是否存在,存在時(shí)則可快速返回該表不能啟用表鎖
意向共享鎖(IS鎖)(表鎖):Intention Shared Locks
表示事務(wù)準(zhǔn)備給數(shù)據(jù)行加入共享鎖,也就是說一個(gè)數(shù)據(jù)行加共享鎖 前必須先取得該表的IS鎖。
意向排它鎖(IX鎖)(表鎖):Intention Exclusive Locks
表示事務(wù)準(zhǔn)備給數(shù)據(jù)行加入排他鎖,說明事務(wù)在一個(gè)數(shù)據(jù)行加排他 鎖前必須先取得該表的IX鎖。