實驗總結
經常聽到別人說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 多版本控制 控制,本文不考慮此種技術...