#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...