資料庫的鎖用來鎖住資料庫中的某些資料,使得當前只能有乙個使用者/會話可以更新資料。所以,資料庫的鎖用來防止同時有乙個或多個使用者更新同一塊資料。當資料被鎖起來,這意味著另乙個資料庫會話在鎖釋放之前不能更新這塊被鎖起來的資料。
畫重點:
假如會話a
嘗試訪問被會話b
鎖起來的資料,會話a會發生什麼?會話a會被置於lock wait
狀態,並且會話a接下來不會進行任何事務操作。也就是說,a會被「暫停」,直到b把鎖釋放掉。
如果乙個會話為了等待鎖釋放,對於有些資料庫例如db2,會設定乙個超時時間,當超過這個時間還沒有等到鎖被釋放掉,就會停止等待,並丟擲錯誤。但oracle會一直無限等下去。所以不同的資料庫處理lock wait
狀態的機制是不一樣的。
資料庫的鎖有不同的層級,既鎖的粒度(lock granularity)。下面是幾種常見的粒度:
資料庫層級的鎖
這種鎖會將整個資料庫都鎖住,意味著當前只能有乙個會話可以對資料庫進行更新操作。這種鎖不經常使用,因為阻止了其他所有使用者,只留下乙個可以對資料庫進行操作。但這各種鎖在資料庫更新的時候很有用,例如將資料庫更新到新版本。oracle有乙個exclusive mode
,就是這種層級的鎖。
檔案層級的鎖
這種層級鎖會把整個資料庫檔案鎖住。但問題來了,什麼是資料庫檔案呢(a file in a datebase
)?資料庫檔案裡面儲存的是某些資料——可以是整張表的資料,也可以是表的一部分資料,甚至是幾張表的部分資料。因為許多資料混在一起存到乙個檔案裡,所以這種檔案層級的鎖不怎麼使用。
表層級的鎖(table level locking)
這種鎖很好理解——整張表都被鎖住。當對整張表進行操作(例如更新表中的所有行,修改或刪除某些列),這種鎖就非常實用。在oracle中,這種鎖叫ddl鎖
,ddl——data definition language
, 包含了create drop alter
等操作,會對整張表進行修改。
塊層級的鎖
資料庫檔案的某一塊被鎖住,這種鎖也不常用。因為資料可以儲存到不連續的多個塊上。
列級的鎖(column level locking)
這種鎖也不常用,因為要花費大量的資源來實現它。
行級鎖(row level locking)
這種鎖鎖住表中的一行資料。這是最常用的一種鎖,幾乎所有的資料庫都支援行級鎖
即使你沒有在sql語句中寫特定的語句來使用鎖,當進行update或delete操作時,鎖都會被啟用。
例如我們有如下語句:
資料庫首先找到some_columns
值為xyz
的所有行,將這些行都鎖住,以防止其他會話同時進行更新操作。
看加的是什麼鎖了,有的鎖是read-exclusive
, 有這種鎖的時候,其他會話讀資料都不行。
使用鎖的乙個問題是會產生競爭,因為資料被加了鎖,其他多個會話會同時申請對資料的更新操作。如果情況不嚴重,某些使用者操作會卡頓,因為需要等待鎖的釋放。嚴重情況下,多個會話都在等待鎖釋放,有些會話會陷入無限等待狀態。當會話陷入無限等待狀態,這種情況就被稱之為死鎖
。
翻譯自:
資料庫的鎖
相當好的文章!希望以後結合實踐再好好理解。innodb中的事務隔離級別和鎖的關係 mysql faq 系列 如何檢視當前最新事務id mysql 對於千萬級的大表要怎麼優化?鎖有悲觀鎖和樂觀鎖。悲觀鎖中分共享鎖和排他鎖。在事務中,讀資料的時候加分享鎖 其他事務還可以加分享鎖,但是不能加排他鎖 寫資料...
資料庫的鎖
innodb 除了支援行級鎖,還支援由 mysql 服務層實現的表級鎖 lock tables write在指定的表加上表級排他鎖 當這兩種鎖同時存在時,可能導致衝突。例如,事務 a 獲取了表中一行資料的讀鎖 然後事務 b 申請該錶的寫鎖 例如修改表的結構 如果事務 b 加鎖成功,那麼它就應該能修改...
資料庫的鎖
鎖是用於管理對共享資源的併發訪問,是資料庫系統區別於檔案系統的乙個關鍵特性 本文主要來談innodb引擎,innodb引擎支援行鎖 表鎖粒度的鎖 為了支援多粒度鎖定,innodb 儲存引擎引入了意向鎖 intention lock 意向鎖是表級鎖 什麼是意向鎖呢?如果沒有意向鎖,當已經有人使用行鎖對...