一、定義
為了解決資源共享而造成的并發(fā)問題靖榕。
買最后一件衣服X:
A:對衣服X進行加鎖——試衣服蓖谢、下單捂蕴、打包——對衣服X解鎖
B:發(fā)現(xiàn)衣服X被加鎖,只能等待X解鎖闪幽,X解鎖后發(fā)現(xiàn)衣服今天售空
二啥辨、分類
按操作類型:
①讀鎖(共享鎖):對同一數(shù)據(jù),多個讀操作可以同時進行盯腌,互不干擾
②寫鎖(排它鎖):如果當(dāng)前寫操作沒有結(jié)束溉知,則無法進行其他的讀操作和寫操作
讀:select
寫:update、insert into腕够、delete
按操作范圍:
①表鎖():一次性對一張表進行整體加鎖
表類型為MyISAM , 開銷小级乍,加鎖快,無死鎖帚湘,鎖的范圍大容易造成鎖沖突玫荣,并發(fā)度低
②行鎖:一次性對一條數(shù)據(jù)進行加鎖
表類型為InnoDB,開銷大客们,加鎖慢,死鎖材诽,鎖的范圍小不會造成鎖沖突底挫,并發(fā)度高
③頁鎖
死鎖:兩個及兩個以上事務(wù)在執(zhí)行過程中,因資源爭奪而造成的相互等待的現(xiàn)象
并發(fā)度高:很小的概率出現(xiàn)高并發(fā)問題脸侥,如臟讀建邓、幻讀和不可重復(fù)讀
三、表鎖用MyISAM(讀)
會話0 : lock table 表1 read
會話0:可以讀表1睁枕;不可以寫表1官边;不可以讀、寫其他表
其他會話:可以讀表1外遇;不可以寫表1注簿;可以讀、寫其他表
四跳仿、表鎖用MyISAM(寫)
會話0:lock table 表1 write
會話0:可以讀表1诡渴;:可以寫表1;不可以讀菲语、寫其他表
其他會話:對表1進行增刪改查的前提是會話0釋放寫鎖
五妄辩、表鎖進行解鎖
unlock table 表1惑灵;
也可以通過事務(wù)來解鎖
六、分析表鎖定
show open tables? ? 1代表加鎖眼耀,0代表沒有加鎖
show status like 'table%'
①table_locks_immediate :可能獲得的鎖數(shù)
②table_locks_waited:需要等待的表鎖數(shù)(值越大英支,表示存在越大的鎖競爭)
一般建議:
當(dāng)table_locks_immediate/table_locks_waited>5000,用InnoDB哮伟,否則用MyISAM
七干花、行鎖用InnoDB(寫)
會話0:增刪改操作(同樣的數(shù)據(jù)),進行加鎖
會話1:增刪改操作(同樣的數(shù)據(jù))把敢,發(fā)現(xiàn)數(shù)據(jù)被加鎖,不能進行增刪改操作谅辣;直到會話0將該鎖釋放才能進行寫操作
行鎖通過事務(wù)commit/rollback進行解鎖
會話0:增刪改操作(不同的數(shù)據(jù))修赞,進行加鎖
會話1:增刪改操作(不同的數(shù)據(jù)),會話0不影響會話1的增刪改操作
注意事項:
①如果沒有索引桑阶,則行鎖轉(zhuǎn)為表鎖
當(dāng)索引類型轉(zhuǎn)換柏副,則索引失效,行鎖轉(zhuǎn)化為表鎖
②行鎖的一種特殊情況:間隙鎖
表1中沒有id=7的數(shù)據(jù)
update 表1 set name='x' where id>1 and id<9
間隙:mysql會自動給間隙加鎖(稱為間隙鎖)
行鎖:如果有where ,則實際加鎖的范圍就是where后面的范圍蚣录,不是實際的值
InnoDB用的是行鎖
行鎖的優(yōu)點:并發(fā)能力強割择,效率高
行鎖的缺點:比表鎖性能損耗大
所以如果是高并發(fā),采用InnoDB,否則用MyISAM
八萎河、行鎖用InnoDB(讀)
怎么在查詢的時候加鎖呢荔泳?
select * from score for update(此條查詢加鎖了)
通過for update給查詢語句加鎖