mysql 二段鎖 MySQL的兩階段加鎖協議

2021-10-20 22:14:45 字數 1646 閱讀 5398

#mysql-兩階段加鎖協定 ##媒介此篇部落格主如果講述mysql(僅限innodb)的兩階段加鎖(2pl)協定,而非兩階段提交(2pc)協定,差別如下:2pl,兩階段加鎖協定:重要用於單機事務中的一致性與隔離性。

2pc,兩階段提交協定:重要用於分布式事務。

mysql本身針對機能,還有乙個mvcc(多版本控制)控制,本文不推敲此種技巧,僅僅推敲mysql本身的加鎖協定。 ##什麼時刻會加鎖在對記錄更新操作或者(select for update、lock in share model)時,會對記錄加鎖(有共享鎖、排它鎖、意向鎖、gap鎖、nextkey鎖等等),本文為了簡單推敲,不推敲鎖的種類。 ##什麼是兩階段加鎖在乙個事務琅綾擎,分為加鎖(lock)階段和解鎖(unlock)階段,也即所有的lock操作都在unlock操作之前,如下圖所示:

##為什麼須要兩階段加鎖

大年夜膳綾擎的例子中,可以看出,須要把最熱點的記錄,

惹人2pl是為了包管事務的隔離性,即多個事務在併發的情況劣等同於序列的履行。 在數學上證清楚明了如下的封鎖定理:

如**事務是良構的且是兩階段的,那麼任何乙個合法的調劑都是隔離的。

具體的數學推到過程可以參照<>這本書的7.5.8.2節.

此書乃是關於資料庫事務的聖經,無需解釋(中文翻譯固然晦澀,也能保持讀下去,強烈推薦)

##工程實踐中的兩階段加鎖-s2pl 在實際情況下,sql是千變萬化、條數不定的,資料庫很難在事務中剖斷什麼是加鎖階段,什麼是解鎖階段。於是惹人了s2pl(strict-2pl),即:

如下圖所示:

如許的話,在實際的資料庫中就很輕易實現了。 ##兩階段加鎖對機能的影響

膳綾擎很好的說清楚明了兩階段加鎖,如今我們分析下其對機能的影響。推敲下面兩種不合的扣減庫存的籌畫:

(具體的鎖型別較為複雜,不在這琅綾氰述),所以兩者效**一樣。

籌畫1:begin;

// 扣減庫存

updatet_inventorysetcount=count-5whereid=$andcount>= 5;

// 鎖住使用者賬戶表

select*fromt_user_accountwhereuser_id=123forupdate;

// 插入訂單記錄

insertintot_trans;

commit;

籌畫2:begin;

// 鎖住使用者賬戶表

select*fromt_user_accountwhereuser_id=123forupdate;

// 插入訂單記錄

insertintot_trans;

// 扣減庫存

updatet_inventorysetcount=count-5whereid=$andcount>= 5;

commit;

因為在同乙個事務之內,這幾條對資料庫的操作應當是等價的。但在兩階段加鎖下的機能確是有比較大年夜的差距。兩者籌畫的時序如下圖所示:

推薦閱讀

這些常識是在平常的瀏覽中,零碎的獲得的,本身總結了一下,分享在這裡全域性變數vs函式引數i=i+1; i++; i--; 這三個語句都平日引用在for()或者是while()裡邊,大年夜履行效力上來說 3》2》1這和最畢生成的彙編說話有》詳細閱讀

04 二段 切換 掌控大腦的兩種模式

你要理解大腦有兩種模式 自動駕駛模式和主動控制模式,並且你還能做到在兩種模式之間自如切換。我先來給你講乙個碧昂斯的秘密 她是世界級的超級巨星,在全球已經賣了超過1億張唱片,還拿了22項格林美獎。碧昂斯在巡迴演唱會的舞台上激情四射,氣場強大,引吭高歌。可是演唱會結束後,她就變成了一名產品經理。這是怎麼...

簡單的物體二段跳效果

非常非常簡單的效果,按任意鍵進行方塊的跳躍,有二段跳效果和輕跳和重跳效果,根據按鍵長短判定的。這是在兄弟會論壇做的一道題,很應該轉來跟大家分享下 如下 package private function configurecontrol void private function drawrect p...

mysql的悲觀鎖 mysql悲觀鎖

1.create database lock test db 2.create user test 1 identified by 123456 3.grant all privileges on lock test db.to test 1 identified by 123456 4.flush...