Mysql鎖機制 讀鎖

2022-04-21 09:19:08 字數 2215 閱讀 2856

mysql 系列文章主頁

1 準備資料

1.1 建表

1.1.1 建立 employee表

drop

table

ifexists

employee;

create

table

ifnot

exists

employee (

id intprimary

keyauto_increment,

name

varchar(40

), dept_id

int)engine myisam;

1.1.2 建立 department 表

drop

table

ifexists

department;

create

table

ifnot

exists

department (

id intprimary

keyauto_increment,

name

varchar(40

))engine myisam;

1.1.3 注意:上述兩張表的儲存引擎都是 myisam

1.2 插入資料

insert

into employee(name, dept_id) values('

alice

', 1

);insert

into employee(name, dept_id) values('

bob', 1);

insert

into department(name) values('

rd');

2 測試2.1 給 employee 表加上讀鎖

lock table employee read;
2.2 查詢 employee 表

2.2.1 當前會話(終端、命令列視窗)

注意:當前會話是指執行了上面的 lock table employee read 語句的會話(視窗、命令列);在我的例子中,是白色背景。

select

*from employee;

2.2.2 其它會話(終端、命令列視窗)

注意:新開乙個會話視窗;在我的例子中,是黑色背景。

2.2.3 結論

可以看到,加了讀鎖後,當前會話和其它會話都可以進行讀操作,即:讀鎖對於讀操作共享。

2.3 更新 employee 表

2.3.1 當前會話

update employee set name =

'alice02

'where id =

1;

2.3.2 其它會話

結果:被掛起、阻塞(上圖)

接下來,在『當前會話』中執行 unlock tables 命令解除鎖定(上圖)

解除鎖定後,『其它會話』中的更新語句馬上得到執行;可以看到,耗時 1 min 5.11 sec(上圖)

2.3.3 結論

對於更新操作:

2.4 讀其它表

2.4.0 準備

lock table employee read;
2.4.1 當前會話

select

*from department;

2.4.2 其它會話

2.4.3 結論

對於其它表的讀取操作:

3 結論

讀鎖,對於當前會話 (owner) 來說,可以讀取鎖住的表、但不能更新,也不能讀取其它表;

對於其它會話 (other) 來說,可以讀取鎖住的表、更新會被阻塞,可以正常讀取其它表;

讀鎖對於讀操作共享;

深入Mysql鎖機制(二)讀鎖和寫鎖

這篇文章主要來介紹一下mysql資料庫中的表級鎖。本文提到的讀鎖和寫鎖都是mysql資料庫的myisam引擎支援的表鎖的。而對於行級鎖的共享讀鎖和互斥寫鎖請閱讀mysql中的共享鎖與排他鎖。我習慣在描述表鎖的時候按照讀寫來區分,在表述行鎖的時候按照共享和互斥來區分。其實無論是表鎖還是行鎖。共享鎖指的...

mysql鎖機制 mysql 鎖機制

一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...

mysql鎖機制 php Mysql鎖機制

表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行級鎖 開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。共享鎖和排它鎖 頁面鎖 開銷和加鎖時間界於表鎖和行鎖之間 會出現死鎖 鎖定粒度界於表鎖和行鎖之間,併發度一般 mysql的行級鎖有...