按操作的型別分:
讀鎖(共享鎖):針對同乙份資料,多個讀操作可以同時進行而不會相互影響。
寫鎖(排它鎖):當前寫操作沒有完成,會阻斷其它的寫鎖和讀鎖。
按對資料操作的粒度分:
表鎖(偏讀):整個表被鎖,偏向於myisam引擎,開銷小,加鎖快,無死鎖;
鎖定粒度大,發生鎖衝突的概率最高,併發度最低。 行鎖
表級鎖分析
1、建表語句:
create table `userlock` (
`id` int(8) not null,
`name` varchar(20) default null,
primary key (`id`)
) engine=myisam default charset=utf8;
create table `
booklock
` (`id` int(8) not null,
`name` varchar(20) default null,
primary key (`id`)
) engine=myisam default charset=utf8;
插入資料:
insert into `test`.`userlock
` (`name`, `id`) values ('ba', '1');
insert into `test`.`userlock
` (`name`, `id`) values ('ca', '2');
insert into `test`.`bookl
ock` (`name`, `id`) values ('ba', '1');
insert into `test`.`bookl
ock` (`name`, `id`) values ('ca', '2');
2、手動增加表鎖
lock table 表名字1 read(write),表名字2 read(write)。。。
3、檢視表上加過的鎖
in_use=0說明表沒有加鎖
4、給 booklock表加讀鎖,給userlock加寫鎖
5.釋放表鎖
unlock tables;
6.表鎖的分析比較
讀鎖(共享鎖)
寫鎖(排它鎖)
給userlock新增寫鎖
(1)當前session對鎖定表進行查詢、更新、插入都不會出錯
當前session對其它沒有鎖定的表查詢,更新、插入都會出錯
(2)其它session對鎖定的表的查詢(讀、寫都會被阻塞)被阻塞,需要等待鎖被釋放
其它session對沒有被鎖定的表進行增刪改查都不會出錯。
總結
讀鎖會阻塞寫(其它session不能寫被鎖定的表),但是不會阻塞
讀;而寫鎖則會把讀和寫都阻塞(其它session不能讀寫被鎖定的
表)。
7.使用show status like 'table%';
通過檢查table_locks_immediate和table_locks_waited狀態量來分析系統上的表鎖定:
table_locks_immediate:產生表級鎖定的次數,表示可以立即獲取鎖的查詢次數,每立即獲取鎖一次值加1;
table_locks_waited:出現表級鎖定爭用而發生等待的次數(不能立即獲取鎖的次數,每等待一次鎖值加1),此值高則說明存在著較嚴重的表級鎖爭用的情況。
myisam的讀寫鎖排程是寫優先,這也是myisam不適合做寫為主的表的引擎。因為寫鎖後,其它執行緒不能做任何操作,大量的更新會使查詢很難得到鎖,從而造成永遠阻塞。
Mysql 資料庫表鎖 行鎖
偏向myisam,開銷小,加鎖快,無死鎖,鎖粒度大,發生鎖衝突的概率較高,併發度較低。測試表,用於表加鎖後的讀寫可能性驗證 create table if not exists table lock id int 10 primary key not null auto increment comm...
MySQL資料庫事務中的行級鎖,表級鎖,頁級鎖
鎖定用於確保事務完整性和資料庫一致性。鎖定可以防止使用者讀取其他使用者正在更改的資料,並防止多個使用者同時更改相同的資料。如果不使用鎖定,資料庫中的資料可能在邏輯上變得不正確,而針對這些資料進行查詢可能會產生想不到的結果。在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發...
詳解MySQL資料庫中的 全域性鎖 表級鎖 行級鎖
在軟體開發中,程式在高併發的情況下,為了保證一致性或者說安全性,我們通常都會通過加鎖的方式來解決,在 mysql 資料庫中同樣有這樣的問題,一方面為了最大程度的利用資料庫的併發訪問,另一方面又需要保證每個使用者能以一致的方式讀取和修改資料,就引入了鎖機制。全域性鎖是粒度最大的鎖,基本上也使用不上,就...