MySQL行級鎖 表級鎖

2021-10-11 13:41:25 字數 1219 閱讀 3053

行級鎖

、表級鎖的資料不能被其它事務再鎖定,也不被其它事務修改(修改、刪除)

,是表級鎖時,不管是否查詢到記錄,都會鎖定表

innodb

行鎖是通過給索引上的索引項加鎖

來實現的,這一點mysql與

oracle

不同,後者是通過在資料塊中對相應資料行加鎖來實現的。innodb這種行鎖實現特點意味著:只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb將使用表鎖!

行級鎖都是基於索引的,如果一條sql語句用不到索引是不會使用行級鎖的,會使用表級鎖。

行級鎖的缺點是:由於需要請求大量的鎖資源,所以速度慢,記憶體消耗大,並且可能導致大量的鎖衝突,從而影響併發效能。

針對死鎖這個話題,myisam中是不會產生死鎖的,因為myisam總是一次性獲得所需的全部鎖,要麼全部滿足,要麼全部等待。

而在innodb中,鎖是逐步獲得的,就造成了死鎖的可能。

在mysql中,行級鎖並不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql語句操作了主鍵索引,mysql就會鎖定這條主鍵索引;如果一條語句操作了非主鍵索引,mysql會先鎖定該非主鍵索引,再鎖定相關的主鍵索引。 在update、delete操作時,mysql不僅鎖定where條件掃瞄過的所有索引記錄,而且會鎖定相鄰的鍵值,即所謂的next-key locking。

當兩個事務同時執行,乙個鎖住了

主鍵索引在等待其他相關索引,乙個鎖定了非主鍵索引,在等待主鍵索引。這樣就會發生死鎖。

發生死鎖後,innodb一般都可以檢測到,並使乙個事務釋放鎖回退,另乙個獲取鎖完成事務。

mysql:

select * from information_schema.innodb_trx;

show open tables where in_use > 0;

oracle:

select  a.sid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name

from v$process p, v$session a, v$locked_object b, all_objects c

where p.addr = a.paddr 

and a.process = b.process

and c.object_id = b.object_id

MySQL行級鎖 表級鎖 頁級鎖

mysql資料庫由於其自身架構的特點,存在多種資料儲存引擎,每種儲存引擎所針對的應用場景特點都不太一樣,為了滿足各自特定應用場景的需求,每種儲存引擎的鎖定機制都是為各自所面對的特定場景而優化設計,所以各儲存引擎的鎖定機制也有較大區別。mysql各儲存引擎使用了三種型別 級別 的鎖定機制 表級鎖定,行...

MySQL行級鎖和表級鎖

鎖定用於確保事務完整性和資料庫一致性。鎖定可以防止使用者讀取其他使用者正在更改的資料,並防止多個使用者同時更改相同的資料。如果不使用鎖定,資料庫中的資料可能在邏輯上變得不正確,而針對這些資料進行查詢可能會產生想不到的結果。在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發...

MySQL表級鎖和行級鎖

一 概述 相對其他資料庫而言,mysql的鎖機制比較簡單,其最顯著的特點是不同的儲存引擎支援不同的鎖機制。比如,myisam和memory儲存引擎採用的是表級鎖 table level locking innodb儲存引擎既支援行級鎖 row level locking 也支援表級鎖,但預設情況下是...