一 鎖的分類以及實現(xiàn)
1.1 鎖概念
共享鎖:共享鎖加上了姨夹,只能讀不能寫陨囊,事務(wù)a和事務(wù)b都可以讀數(shù)據(jù)逗抑,但是如果事務(wù)a加上鎖剧辐,事務(wù)b
可以讀,但是不能寫邮府,只有事務(wù)a可以寫
排他鎖:排他鎖加上了荧关,其他事務(wù)既不能讀也不能寫,會把加鎖的所有數(shù)據(jù)鎖上褂傀,比如事務(wù)a和事務(wù)b
事務(wù)a加上了行鎖忍啤,事務(wù)a可以對加鎖的數(shù)據(jù)進行讀和寫,但是事務(wù)b只能等待事務(wù)a commit完,事務(wù)a
釋放掉鎖同波,事務(wù)b才會讀和寫
行鎖:語義上很容易理解鳄梅,就是事務(wù)一行加鎖,比如sql語句:
select * from merchent_order where id = 1 for update
因為id是主健未檩,默認對id=1的數(shù)據(jù)進行加鎖戴尸,鎖住一行數(shù)據(jù)
表鎖:鎖整個表,比如sql語句:
select? * from merchant_order for update;
對整個表進行加鎖冤狡。
悲觀鎖:比如mysql的for update孙蒙,禁止其他事務(wù)進行讀寫操作,實際上在高并發(fā)場景下悲雳,對整個系統(tǒng)的吞吐性來講挎峦,比較差,在數(shù)據(jù)很嚴格要求一致性的情況下合瓢,這種加鎖方式有效坦胶,但是會犧牲系統(tǒng)的性能,所以一般在系統(tǒng)查詢占比很多的情況下會加樂觀鎖晴楔,
樂觀鎖:加上版本號就可以實現(xiàn)樂觀鎖顿苇,類似java的CAS機制,具體實現(xiàn)sql:
update merchant_order set num = num+1 where version = ${version}
1.2 mysq事務(wù)隔離級別
讀未提交:最低的事務(wù)隔離級別滥崩,事務(wù)a可以讀取事務(wù)b提交的數(shù)據(jù)岖圈,可能出現(xiàn)臟讀,幻讀
讀已提交:事務(wù)a可以讀取事務(wù)b提交的數(shù)據(jù)钙皮,可能出現(xiàn)幻讀,不允許任何中間狀態(tài)出現(xiàn)顽决,所以
不可能出現(xiàn)臟讀短条,可能出現(xiàn)不可重復(fù)讀。
備注:不可重復(fù)讀(第一次和第二次讀取的數(shù)據(jù)可能不一樣)才菠,可重復(fù)讀(第一次和第二次查詢
的數(shù)據(jù)一致)
可重復(fù)讀:多次同一個事務(wù)讀取的事務(wù)是一樣的茸时,沒有幻讀出現(xiàn),也沒有臟讀
串行化:讀取的時候赋访,默認加共享鎖可都,等一個事務(wù)執(zhí)行完,下一個事務(wù)才能開始執(zhí)行蚓耽,更新需要獲取
排他鎖渠牲,是最高的隔離級別