MySQL的兩階段所協議2PL

2021-10-12 16:35:31 字數 1765 閱讀 1347

實驗總結

經常聽到別人說2pl,猛的一聽當時真的是一臉懵逼的感覺,啥意思?2pl是什麼玩意?後來又聽人說兩階段鎖協議,這個又是什麼?我咋沒有聽過呢?

後來才知這是mysql中的乙個術語:2pl(two-phase locking),翻譯成中文就是兩階段鎖協議。

廢話不多說,我們來用實際的例子體驗一把。

實驗的前提條件:

實驗使用到的表結構如下所示:

create

table

`t`(

`id`

int(11)

notnull

,`name`

varchar(16

)default

null

,primary

key(

`id`))

engine

=innodb

default

charset

=utf8mb4;

此次實驗中使用到的初始化資料如下所示:

insert

into t(id, name)

values(1

,'a');

insert

into t(id, name)

values(2

,'b');

insert

into t(id, name)

values(3

,'c');

insert

into t(id, name)

values(4

,'d'

);

我們來簡單說一下實驗的具體步驟:

開啟乙個左側的事務。

開啟乙個右側的事務。

在左側事務中查詢表t中的所有資料。

在右側事務中查詢表t中的所有資料。

在左側事務中,獲取id=3的資料行的x鎖。

在左側事務中,更新id=3的資料行內容。

在左側事務中,查詢更新後的id=3的資料行內容。

在左側事務中,獲取id=2的資料行的x鎖。

在右側事務中,嘗試獲取id=3的資料行的x鎖,獲取失敗。

實驗的截圖如下所示:

問題:為什麼在第9步中,沒有獲取到id=3的資料行的x鎖呢?按道理左側的事務已經修改完成了id=3的資料行,它已經去獲取了id=2的資料行的x鎖了,id=3的豎行的x鎖對它已經沒有用了,為什麼在右側事務中仍然不能獲取到id=3的資料行的x鎖呢?

答案:mysql中的兩階段鎖協議的工作機制就是這麼設計的。

在mysql中,兩階段鎖協議的含義是:當乙個事務獲取到了某乙個資料庫物件的鎖之後,並不是當前事務不需要操作它了之後,這個鎖就會馬上釋放掉,這個鎖會一直被這個事務持有,直到這個事務被提交或回滾後,這個鎖才會被釋放掉。所以,在當前事務還沒有結束的時候,任何其他事務嘗試獲取這個鎖的時候,都會被阻塞。知道當前事務提交或回滾後,前提事務才可以獲取到這把鎖。

這就是mysql中2pl兩階段鎖協議的含義。它在事務併發的時候,為資料的一致性提供有力的保障。

2PL協議,兩段封鎖協議

two phase locking protocol 2pl協議,兩段封鎖協議 two phase transaction and two phase locking protocol 在乙個事務中,如果加鎖動作都在釋放鎖動作之前稱此事務為兩段事務。上述加鎖的限制稱兩段封鎖協議。兩段事務可截然為兩段...

mysql兩階段鎖協議 MySql 兩階段加鎖協議

mysql 兩階段加鎖協議 前言此篇部落格主要是講述mysql 僅限innodb 的兩階段加鎖 2pl 協議,而非兩階段提交 2pc 協議,區別如下 2pl,兩階段加鎖協議 主要用於單機事務中的一致性與隔離性。2pc,兩階段提交協議 主要用於分布式事務。mysql本身針對性能,還有乙個mvcc 多版...

MySql 兩階段加鎖協議

此篇部落格主要是講述mysql 僅限innodb 的兩階段加鎖 2pl 協議,而非兩階段提交 2pc 協議,區別如下 2pl,兩階段加鎖協議 主要用於單機事務中的一致性與隔離性。2pc,兩階段提交協議 主要用於分布式事務。mysql本身針對性能,還有乙個mvcc 多版本控制 控制,本文不考慮此種技術...