共享鎖又稱為讀鎖,簡(jiǎn)稱S鎖,顧名思義,共享鎖就是多個(gè)事務(wù)對(duì)于同一數(shù)據(jù)可以共享一把鎖,都能訪問(wèn)到數(shù)據(jù),但是只能讀不能修改。
排他鎖又稱為寫鎖,簡(jiǎn)稱X鎖,顧名思義,排他鎖就是不能與其他所并存,如一個(gè)事務(wù)獲取了一個(gè)數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務(wù)是可以對(duì)數(shù)據(jù)就行讀取和修改。
簡(jiǎn)單說(shuō),在一個(gè)事物中共享鎖上鎖后,使用共享鎖、排它鎖、普通查詢都可以查到數(shù)據(jù)。排它鎖上鎖后,共享鎖不能讀取數(shù)據(jù),普通查詢?cè)谶@倆鎖之間都可以讀取數(shù)據(jù)。
開啟事物 上排它鎖。

1.png
使用共享鎖查詢數(shù)據(jù)、可以看到此時(shí)處于阻塞狀態(tài)。

2.png
普通查詢、沒(méi)問(wèn)題(說(shuō)明普通查詢不受鎖機(jī)制影響)

5.png
提交事物、

3.png
使用共享鎖響應(yīng)數(shù)據(jù)、

4.png
排它鎖:
開啟

1.png
查詢數(shù)據(jù)、還是之前得數(shù)字

2.png
提交

3.png
繼續(xù)查詢 修改完成

4.png
SET AUTOCOMMIT = 0 設(shè)置不自動(dòng)提交
BEGIN 開啟事務(wù)
SELECT * FROM ceshi WHERE ceshi_id =2 FOR UPDATE 排他鎖
UPDATE ceshi SET NAMES = "67" WHERE ceshi_id = 2; 修改
SAVEPOINT adqoo_1 做事務(wù)標(biāo)記
UPDATE ceshi SET NAMES = "8" WHERE ceshi_id = 2;
SAVEPOINT adqoo_2
UPDATE ceshi SET NAMES = "9" WHERE ceshi_id = 2;
SAVEPOINT adqoo_3
ROLLBACK TO SAVEPOINT adqoo_3 回到那個(gè)事務(wù)標(biāo)記
COMMIT 提交
最后說(shuō)一下 在mysql InnoDb引擎中update,delete,insert語(yǔ)句自動(dòng)加排他鎖 只有 select 需要手動(dòng)加鎖