數據庫的鎖主要用來保證數據的一致性的。MyISAM存儲引擎只支持表鎖,InnoDB存儲引擎既支持行鎖,也支持表鎖,但默認狀況下是採用行鎖。mysql
1.按照對數據操做的類型分:讀鎖,寫鎖sql
注:讀鎖和寫鎖都是阻塞鎖。數據庫
2.按照數據操做的粒度:表鎖,行鎖,頁鎖bash
1.手動增長表鎖併發
lock table 表名 [read|write],表名 [read|write]…優化
2.解鎖ui
unlock tables;spa
3.查看哪些表被鎖線程
show open tables;3d
1.讀鎖
create table lock_one(
 id int primary key auto_increment,
 col int
)engine=myisam;
insert into lock_one(col) values (1);
insert into lock_one(col) values (2);
insert into lock_one(col) values (3);
複製代碼
下面咱們模擬兩個用戶,即兩個線程鏈接數據庫,開啓兩個xsheel窗口,鏈接到mysql:
lock table lock_one read;
複製代碼
select * from lock_one;
複製代碼
答案是能夠的。
答案也是能夠的。
例如,查詢 users表:select * from users;
咱們發現是不能夠查詢其餘表的,這是由於當前會話已經對lock_one表加上了鎖,即當前線程鎖住了lock_one表,只能夠操做lock_one表,就不能夠查詢其餘的表。
select * from users;
複製代碼
咱們發現是能夠的。由於會話2和會話1是沒有關係的,會話2查詢會話1鎖住的表均可以,查詢沒有鎖住的 確定是能夠的。
update lock_one set col=66 where id=1;
複製代碼
發現是不能夠的,由於咱們對 lock_one表加了 讀鎖,因此是不能夠 進行寫操做的。
咱們發現是沒有執行結果的,也就是說 正在等待更新,在阻塞等待中。由於咱們在會話1中對lock_one中增長了讀鎖,其餘人只有讀的操做,沒有寫的操做。
2.寫鎖
lock table lock_one write;
複製代碼
select * from lock_one;
複製代碼
咱們發現是能夠的。
咱們發現是沒有執行結果的,也就是說 處於阻塞狀態。由於寫鎖是排它鎖,其餘用戶線程不能夠讀取當前鎖住的表,只有解鎖以後 其餘用戶線程才能夠執行select
select * from users;
複製代碼
咱們發現是不能夠的。道理和讀鎖的時候同樣,當前會話已經對lock_one表加上了鎖,即當前線程鎖住了lock_one表,只能夠操做lock_one表,就不能夠查詢其餘的表。
答案確定是能夠的。由於之和鎖的表有關係,和其餘表沒有任何關係。
答案必定是能夠的。由於會話1對lock_one表進行了寫鎖操做,也就是隻能夠寫。
咱們發現是不能夠的。由於寫鎖是排它鎖,也就是隻能夠當前線程操做鎖住的表,其餘用戶線程須要等到解鎖以後才能夠操做該表。
3.總結
1.查詢指令
show status like 'table_lock%';
說明: