一髓涯、概念:
- 什么是鎖?主要是為了解決客戶端并發(fā)讀寫造成沖突問題吞琐,將讀寫操作進行鎖定的功能
二砂轻、表加鎖的類型:
-
讀鎖:又稱為共享鎖奔誓,對數(shù)據(jù)做查詢select 訪問MySQL服務(wù)自動給 表加讀鎖,加了讀鎖的表搔涝,允許多個連接同時對同一張表做查詢訪問(加鎖期間 允許同時讀厨喂,不允許寫)
-
寫鎖:又稱排它鎖或互斥鎖,對數(shù)據(jù)做寫訪問(insert | delete | update )時 庄呈, MySQL服務(wù)會自動給表加寫鎖(加鎖期間 不允許讀和寫)
三蜕煌、表加鎖的范圍(鎖粒度):
-
行級鎖:僅僅對被訪問的行分別加鎖,沒有被訪問的行不加鎖
-
表級鎖:只要是對表做訪問诬留,就會把整張表加鎖(不管訪問的是1行 還是更多行)
四斜纪、相關(guān)命令:
SQL命令 |
說明 |
show open tables where in_user>0; |
查看最近被鎖的表 |
show status like "table_locks%" |
查看鎖表狀態(tài) |
show status like "Table_locks_immediate%" |
立即獲得表級鎖的次數(shù) |
show status like "Table_locks_waited%" |
不能立即獲取表級鎖而需要等待的次數(shù) |
lock tables 表名 read; |
表加讀鎖 |
lock tables 表名 write; |
表加寫鎖 |
unlock tables; |
釋放鎖 |
五、使用示例:
# 第一個連接
]#mysql -uroot -p密碼
# 開啟讀鎖
Mysql> Lock tables tarena.salary read;
# 查詢數(shù)據(jù)正常
Mysql> select * from tarena.salary;
# 第二個連接
]#-uroot -p密碼
# 查詢數(shù)據(jù)正常
Mysql> select * from tarena.salary;
# 插入數(shù)據(jù) 客戶端顯示等待
Mysql> insert into tarena.salary(employee_id,basic) values(1,20000);
# 回到第一個連接
# 釋放讀鎖
MySQL> Unlock tables;
# 回到第二個連接
# Insert命令執(zhí)行成功
# 第一個連接
]#mysql -uroot -p密碼
# 開啟寫鎖
Mysql> Lock tables tarena.salary write;
# 第二個連接
]#-uroot -p密碼
# 查詢數(shù)據(jù) 客戶端顯示等待
Mysql> select * from tarena.salary;
# 插入數(shù)據(jù) 客戶端也顯示等待
Mysql> insert into tarena.salary(
employee_id,basic
) values(1,20000);
# 回到第一個連接
# 釋放鎖
MySQL> Unlock tables;
# 回到第二個連接文兑,
# 查和寫的命令都可以執(zhí)行了