行鎖與表鎖詳解

2022-08-12 13:54:25 字數 1677 閱讀 2451

mysql常用引擎有myisam和innodb,而innodb是mysql預設的引擎。myisam不支援行鎖,而innodb支援行鎖和表鎖。

1.行鎖和表鎖

2.行鎖的型別

3.行鎖的實現

1.行鎖和表鎖

在mysql 的 innodb引擎支援行鎖,與oracle不同,mysql的行鎖是通過索引載入的,即是行鎖是加在索引響應的行上的,要是對應的sql語句沒有走索引,則會全表掃瞄,

行鎖則無法實現,取而代之的是表鎖。

表鎖:不會出現死鎖,發生鎖衝突機率高,併發低。

行鎖:會出現死鎖,發生鎖衝突機率低,併發高。

鎖衝突:例如說事務a將某幾行上鎖後,事務b又對其上鎖,鎖不能共存否則會出現鎖衝突。(但是共享鎖可以共存,共享鎖和排它鎖不能共存,排它鎖和排他鎖也不可以)

死鎖:例如說兩個事務,事務a鎖住了1~5行,同時事務b鎖住了6~10行,此時事務a請求鎖住6~10行,就會阻塞直到事務b施放6~10行的鎖,而隨後事務b又請求鎖住1~5行,事務b也阻塞直到事務a釋放1~5行的鎖。死鎖發生時,會產生deadlock錯誤。

鎖是對錶操作的,所以自然鎖住全表的表鎖就不會出現死鎖。

2.行鎖的型別

行鎖分 共享鎖 和 排它鎖。

共享鎖又稱:讀鎖。當乙個事務對某幾行上讀鎖時,允許其他事務對這幾行進行讀操作,但不允許其進行寫操作,也不允許其他事務給這幾行上排它鎖,但允許上讀鎖。

排它鎖又稱:寫鎖。當乙個事務對某幾個上寫鎖時,不允許其他事務寫,但允許讀。更不允許其他事務給這幾行上任何鎖。包括寫鎖。

上共享鎖的寫法:lock in share mode

例如: select  math from zje where math>60 lock in share mode;

上排它鎖的寫法:for update

例如:select math from zje where math >60 for update;

3.行鎖的實現

注意幾點:

1.行鎖必須有索引才能實現,否則會自動鎖全表,那麼就不是行鎖了。

2.兩個事務不能鎖同乙個索引,例如:

[sql] view plain

copy

事務a先執行:  

select math from zje where math>60 for update;  

事務b再執行:  

select math from zje where math<60 for update;  

這樣的話,事務b是會阻塞的。如果事務b把 math索引換成其他索引就不會阻塞,但注意,換成其他索引鎖住的行不能和math索引鎖住的行有重複。  

3.insert ,delete , update在事務中都會自動預設加上排它鎖。

實現:會話1:

begin;

select  math  from zje where math>60 for update;

會話2:

begin;

update zje set math=99 where math=68;

阻塞...........

會話相當與使用者

如上,會話1先把zje表中math>60的行上排它鎖。然後會話2試圖把math=68的行進行修改,math=68處於math>60中,所以是已經被鎖的,會話2進行操作時,

就會阻塞,等待會話1把鎖釋放。當commit時或者程式結束時,會釋放鎖。

Mysql行鎖與表鎖

用主鍵修改就是行瑣,或者用索引修改就是行瑣 update tab set name xx where id xx 行鎖 update tab set name xx where date 非主鍵或索引 xx 表鎖 插入的時候呢?插入都是行鎖 alert語句修改表結構,表鎖 表鎖和行鎖同時發生時,會等...

mysql 行鎖與表鎖

為日常整理,可能會有些重複.行鎖表表鎖 1 多個事務操作同一行資料時,後來的事務處於阻塞等待狀態。這樣可以避免了髒讀等資料一致性的問題。後來的事務可以操作其他行資料,解決了表鎖高併發效能低的問題。2 innodb的行鎖是針對索引加的鎖,不是針對記錄加的鎖。並且該索引不能失效,否則都會從行鎖公升級為表...

Oracle表鎖與行鎖

1 登入資料所在的資料庫 用管理員賬戶登入 2 查詢是否存在鎖表的sql 3 進行表鎖sql 共享方式的表級鎖 share lock table 表 表 inshare mode nowait lock table test user in share mode 獨佔方式表級鎖 exclusive ...