封鎖粒度
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 正在放...