1 準備資料
1.1 建表
1.1.1 建立 employee表
drop table if existsemployee;create table if not existsemployee (
idint primary keyauto_increment,
namevarchar(40),
dept_idint)engine myisam;
1.1.2 建立 department 表
drop table if existsdepartment;create table if not existsdepartment (
idint primary keyauto_increment,
namevarchar(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 write;
2.2 查詢 employee 表
2.2.1 當前會話(終端、命令列視窗)
注意:當前會話是指執行了上面的 lock table employee read 語句的會話(視窗、命令列);在我的例子中,是白色背景。
2.2.2 其它會話(終端、命令列視窗)
注意:新開乙個會話視窗;在我的例子中,是黑色背景。
查詢都會被阻塞(掛起)!
在『當前會話』中解除鎖定
解除鎖定後,『其它會話』才能正常查詢!
2.2.3 結論
可以看到,加了寫鎖後,當前會話可以查詢,但其它會話已經不能查詢了。
2.3 更新 employee 表
2.3.0 準備
重新給 employee 表加上寫鎖
lock table employee write;
2.3.1 當前會話
2.3.2 其它會話
還是被阻塞!
當前會話解除鎖定
解除鎖定後,才能更新
2.3.3 結論
可以看到,加了寫鎖後,當前會話可以更新(寫操作),其它會話的更新操作會被阻塞。
2.4 查詢其它表
2.4.0 準備
重新給 employee 表加上寫鎖
lock table employee write;
2.4.1 當前會話
select * from department;
2.4.2 其它會話
2.4.3 結論
加了寫鎖後,當前會話不能讀取其它表,其它會話可以正常讀取其它表。
3 結論
寫鎖,對於當前會話 (owner) 來說,可以讀取鎖住的表、也可以更新,但不能讀取其它表;
對於其它會話 (other) 來說,不可以讀取鎖住的表、更不可能更新(會被阻塞),但可以正常讀取其它表;
寫鎖是排它的
mysql 隱式鎖和顯示鎖 MySQL的鎖機制
2 解鎖階段 當事務釋放了乙個封鎖以後,事務進入解鎖階段,在該階段只能進行解鎖操作不能再進行加鎖操作。5 隱式和顯示鎖定 innodb會根據隔離級別在需要的時候自動加鎖,這稱為隱式加鎖。另外,innodb也支援通過特定的語句進行顯示加鎖 顯示加共享鎖 select lock in share mod...
mysql 查詢鎖 MySQL 鎖查詢
一 從檢視檢視 檢視程序 show processlist 檢視是否鎖表 show open tables where in use 0 1 檢視當前的事務 select from information schema.innodb trx 2 檢視當前鎖定的事務 select from infor...
mysql鎖機制 mysql 鎖機制
一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...