自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

S 鎖與 X 鎖,當(dāng)前讀與快照讀!

數(shù)據(jù)庫(kù) MySQL
S 鎖,英文為 Shared Lock,中文譯作共享鎖,有時(shí)候我們也稱(chēng)之為讀鎖,即 Read Lock。S 鎖之間是共享的,或者說(shuō)是互不阻塞的。

MySQL 中的鎖還是蠻多的,在之前的文章中,松哥和大家介紹過(guò) MySQL 中的 MDL 鎖,今天我們?cè)賮?lái)看看 MySQL 中比較重要的兩個(gè)鎖:S 鎖和 X 鎖。

1. S 鎖

S 鎖,英文為 Shared Lock,中文譯作共享鎖,有時(shí)候我們也稱(chēng)之為讀鎖,即 Read Lock。S 鎖之間是共享的,或者說(shuō)是互不阻塞的。

當(dāng)事務(wù)讀取一條記錄時(shí),需要先獲取該記錄的 S 鎖。

舉個(gè)例子:

事務(wù) T1 對(duì)記錄 R1 加上了 S 鎖,那么事務(wù) T1 可以讀取 R1 這一行記錄,但是不能修改 R1,其他事務(wù) T2 可以繼續(xù)對(duì) R1 添加 S 鎖,但是不能添加 X 鎖,只有當(dāng) R1 上面的 S 鎖釋放了,才能加上 X 鎖。

舉一個(gè)加 S 鎖的例子,如下圖:

此時(shí),對(duì)于 id=1 的這條記錄,只能讀取不能修改了。假設(shè)在另外一個(gè)事務(wù) T 中,執(zhí)行如下 SQL 是沒(méi)問(wèn)題的,因?yàn)?S 鎖是共享鎖,S 鎖和 S 鎖之間是兼容的:

select * from user where id=1 lock in share mode;

但是如果執(zhí)行如下 SQL 則會(huì)被阻塞,因?yàn)樾薷臄?shù)據(jù)需要獲取 X 鎖,而 S 鎖和 X 鎖不兼容:

update user set username='javaboy' where id=1;

上面這個(gè)更新語(yǔ)句內(nèi)部會(huì)獲取 X 鎖,對(duì)于一些手動(dòng)添加了 X 鎖的查詢語(yǔ)句,也會(huì)阻塞,例如下面這個(gè):

可以看到,這個(gè) SQL 執(zhí)行之后就被阻塞了。

2. X 鎖

X 鎖,英文為 Exclusive Lock,中文譯作排他鎖,有時(shí)候我們也稱(chēng)之為寫(xiě)鎖,即 Write Lock。如同它的名字,X 鎖是具有排他性的,即一個(gè)寫(xiě)鎖會(huì)阻塞其他的 X 鎖和 S 鎖。

當(dāng)事務(wù)需要修改一條記錄時(shí),需要先獲取該記錄的 X 鎖。

舉個(gè)例子:

事務(wù) T1 對(duì)記錄 R1 加上了 X 鎖,那么事務(wù) T1 即可以讀取 R1 也可以修改 R1,而其他事務(wù)則不能對(duì) R1 再添加任何鎖,直到 T1 釋放了 R1 上的鎖。

如上文圖示,鎖定讀的格式是這樣的:

select .... for update;

3. 當(dāng)前讀與快照讀

由上面這兩種鎖,又引申出來(lái)兩種讀:

3.1 快照讀

快照讀(SnapShot Read)是一種一致性不加鎖的讀,是 InnoDB 存儲(chǔ)引擎并發(fā)如此之高的核心原因之一。

在可重復(fù)讀的隔離級(jí)別下,事務(wù)啟動(dòng)的時(shí)候,就會(huì)針對(duì)當(dāng)前庫(kù)拍一個(gè)照片(快照),快照讀讀取到的數(shù)據(jù)要么就是拍照時(shí)的數(shù)據(jù),即事務(wù)開(kāi)啟那一瞬間數(shù)據(jù)庫(kù)中的數(shù)據(jù),要么就是當(dāng)前事務(wù)自身插入/修改過(guò)的數(shù)據(jù)。

我們?nèi)粘K玫牟患渔i的查詢,都屬于快照讀,這個(gè)我就不演示了。

3.2 當(dāng)前讀

與快照讀相對(duì)應(yīng)的就是當(dāng)前讀,當(dāng)前讀就是讀取最新數(shù)據(jù),而不是歷史版本的數(shù)據(jù),換言之,在可重復(fù)讀隔離級(jí)別下,如果使用了當(dāng)前讀,也可以讀到別的事務(wù)已提交的數(shù)據(jù)。

松哥舉個(gè)例子:

MySQL 事務(wù)開(kāi)啟兩個(gè)會(huì)話 A 和 B。

首先在 A 會(huì)話中開(kāi)啟事務(wù)并查詢 id 為 1 的記錄:

接下來(lái)我們?cè)?B 會(huì)話中對(duì) id 為 1 的數(shù)據(jù)進(jìn)行修改,如下:

注意 B 會(huì)話不要開(kāi)啟事務(wù)或者開(kāi)啟了及時(shí)提交事務(wù),否則 update 語(yǔ)句占用一把排他鎖會(huì)導(dǎo)致一會(huì)在 A 會(huì)話中用鎖時(shí)發(fā)生阻塞。

接下來(lái),回到 A 會(huì)話中繼續(xù)做查詢操作,如下:

可以看到,A 會(huì)話中第一個(gè)查詢是快照讀,讀取到的是當(dāng)前事務(wù)開(kāi)啟時(shí)的數(shù)據(jù)狀態(tài),后面兩個(gè)查詢則是當(dāng)前讀,讀取到了當(dāng)前最新的數(shù)據(jù)(B 會(huì)話中修改后的數(shù)據(jù))。

4. 小結(jié)

好啦,一個(gè)小小的知識(shí)點(diǎn),日積月累,fighting!

責(zé)任編輯:武曉燕 來(lái)源: 江南一點(diǎn)雨
相關(guān)推薦

2022-02-17 21:13:08

MySQL架構(gòu)體系

2024-05-17 09:33:22

樂(lè)觀鎖CASversion

2024-09-02 00:00:00

MySQL幻讀數(shù)據(jù)

2022-12-27 10:02:38

MVCC機(jī)制Innodb

2024-07-25 09:01:22

2023-02-23 10:32:52

樂(lè)觀鎖

2022-04-29 11:39:28

MySQL幻讀Gap Lock

2021-03-30 09:45:11

悲觀鎖樂(lè)觀鎖Optimistic

2021-03-31 10:05:26

偏向鎖輕量級(jí)鎖

2017-05-31 14:03:07

Java多線程內(nèi)置鎖與顯示鎖

2023-07-05 08:18:54

Atomic類(lèi)樂(lè)觀鎖悲觀鎖

2010-07-26 15:17:46

SQL Server鎖

2017-05-08 11:46:15

Java多線程

2011-08-18 13:44:42

Oracle悲觀鎖樂(lè)觀鎖

2025-02-08 08:10:00

2019-04-19 09:48:53

樂(lè)觀鎖悲觀鎖數(shù)據(jù)庫(kù)

2023-06-02 08:29:24

https://wwMutex

2024-12-03 00:35:20

2019-05-05 10:15:42

悲觀鎖樂(lè)觀鎖數(shù)據(jù)安全

2021-03-26 10:40:16

MySQL鎖等待死鎖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)