mysql封鎖 MySQL封鎖

2021-10-17 21:46:00 字數 2685 閱讀 4789

封鎖粒度

mysql 中提供了兩種封鎖粒度:行級鎖以及表級鎖。

應該盡量只鎖定需要修改的那部分資料,而不是所有的資源。鎖定的資料量越少,發生鎖爭用的可能就越小,系統的併發程度就越高。

但是加鎖需要消耗資源,鎖的各種操作(包括獲取鎖、釋放鎖、以及檢查鎖狀態)都會增加系統開銷。因此封鎖粒度越小,系統開銷就越大。

在選擇封鎖粒度時,需要在鎖開銷和併發程度之間做乙個權衡。

封鎖型別

1. 讀寫鎖

排它鎖(exclusive),簡寫為 x 鎖,又稱寫鎖。

共享鎖(shared),簡寫為 s 鎖,又稱讀鎖。

有以下兩個規定:

乙個事務對資料物件 a 加了 x 鎖,就可以對 a 進行讀取和更新。加鎖期間其它事務不能對 a 加任何鎖。

乙個事務對資料物件 a 加了 s 鎖,可以對 a 進行讀取操作,但是不能進行更新操作。加鎖期間其它事務能對 a 加 s 鎖,但是不能加 x 鎖。

鎖的相容關係如下:

-xsx

s2. 意向鎖

使用意向鎖(intention locks)可以更容易地支援多粒度封鎖。

在存在行級鎖和表級鎖的情況下,事務 t 想要對錶 a 加 x 鎖,就需要先檢測是否有其它事務對錶 a 或者表 a 中的任意一行加了鎖,那麼就需要對錶 a 的每一行都檢測一次,這是非常耗時的。

意向鎖在原來的 x/s 鎖之上引入了 ix/is,ix/is 都是表鎖,用來表示乙個事務想要在表中的某個資料行上加 x 鎖或 s 鎖。有以下兩個規定:

乙個事務在獲得某個資料行物件的 s 鎖之前,必須先獲得表的 is 鎖或者更強的鎖;

乙個事務在獲得某個資料行物件的 x 鎖之前,必須先獲得表的 ix 鎖。

通過引入意向鎖,事務 t 想要對錶 a 加 x 鎖,只需要先檢測是否有其它事務對錶 a 加了 x/ix/s/is 鎖,如果加了就表示有其它事務正在使用這個表或者表中某一行的鎖,因此事務 t 加 x 鎖失敗。

各種鎖的相容關係如下:

-xixsisxix

sis解釋如下:

任意 is/ix 鎖之間都是相容的,因為它們只是表示想要對錶加鎖,而不是真正加鎖;

s 鎖只與 s 鎖和 is 鎖相容,也就是說事務 t 想要對資料行加 s 鎖,其它事務可以已經獲得對錶或者表中的行的 s 鎖。

封鎖協議

1. **封鎖協議

一級封鎖協議

事務 t 要修改資料 a 時必須加 x 鎖,直到 t 結束才釋放鎖。

可以解決丟失修改問題,因為不能同時有兩個事務對同乙個資料進行修改,那麼事務的修改就不會被覆蓋。

t1t2

lock-x(a)

read a=20

lock-x(a)

wait

write a=19

commit

unlock-x(a)

obtain

read a=19

write a=21

commit

unlock-x(a)

二級封鎖協議

在一級的基礎上,要求讀取資料 a 時必須加 s 鎖,讀取完馬上釋放 s 鎖。

可以解決讀髒資料問題,因為如果乙個事務在對資料 a 進行修改,根據 1 級封鎖協議,會加 x 鎖,那麼就不能再加 s 鎖了,也就是不會讀入資料。

t1t2

lock-x(a)

read a=20

write a=19

lock-s(a)

wait

rollback

a=20

unlock-x(a)

obtain

read a=20

commit

unlock-s(a)

**封鎖協議

在二級的基礎上,要求讀取資料 a 時必須加 s 鎖,直到事務結束了才能釋放 s 鎖。

可以解決不可重複讀的問題,因為讀 a 時,其它事務不能對 a 加 x 鎖,從而避免了在讀的期間資料發生改變。

t1t2

lock-s(a)

read a=20

lock-x(a)

wait

read a=20

commit

unlock-s(a)

obtain

read a=20

write a=19

commit

unlock-x(a)

2. 兩段鎖協議

加鎖和解鎖分為兩個階段進行。

可序列化排程是指,通過併發控制,使得併發執行的事務結果與某個序列執行的事務結果相同。

事務遵循兩段鎖協議是保證可序列化排程的充分條件。例如以下操作滿足兩段鎖協議,它是可序列化排程。

lock-x(a)...lock-s(b)...lock-s(c)...unlock(a)...unlock(c)...unlock(b)

但不是必要條件,例如以下操作不滿足兩段鎖協議,但是它還是可序列化排程。

lock-x(a)...unlock(a)...lock-s(b)...unlock(b)...lock-s(c)...unlock(c)

mysql 隱式與顯示鎖定

mysql 的 innodb 儲存引擎採用兩段鎖協議,會根據隔離級別在需要的時候自動加鎖,並且所有的鎖都是在同一時刻被釋放,這被稱為隱式鎖定。

innodb 也可以使用特定的語句進行顯示鎖定:

select ... lock in share mode;

select ... for update;

MySQL隔離級別和封鎖協議

一直以來對資料庫的事務隔離機制的理解總是停留在表面,其內容也是看一遍忘一邊。這兩天決定從原理上理解它,整理成自己的知識。查閱資料的過程中發現好多零碎的概念如果串起來足夠寫一本書,所以在這裡給自己梳理乙個脈絡,具體的內容參考引文或在網上搜一下。由於平時接觸最多的是mysql,所以文章中某些部分是mys...

命令列的封鎖與反封鎖

前言 這是我以前在shc上發過的文章,被評為了精華,寫這篇文章時參考了bct的劍心的文章,文章裡的 都是參照別人的,對不起大家啦,嘿嘿 正文 這是我以前學會的,看到有人發關於cmd的文章上來就突然想起來了,現在拿出來與大家共享。在cmd啟動之前,系統會先檢視 hkey local machine s...

shell指令碼編寫放行封鎖埠和放行封鎖IP

vim iptables.sh bin bash function ask while true doecho e 1.放行埠 2.封鎖埠 3.放行ip 4.封鎖ip read ep 請選擇你的操作 menu case menu in 1 read ep 請輸入要放行的埠 port echo 正在放...