1.引入
我們在之前的執行緒中,已經初步接觸到了鎖的一些相關的內容。那麼當時的我們使用售票為例子,列舉了在只剩一張票的時候電腦程式在實現購票中不加鎖出現的各種問題。當我們再執行緒中加了鎖以後,就可以保證計算機對這乙個資料的爭搶乙個有序的處理。那麼在mysql資料庫中。我們同樣需要學習資料庫的鎖機制來解決一些相關的問題。
2.mysql資料庫鎖概述
資料庫鎖定機制簡單來說,就是資料庫為了保證資料的一致性,而使各種共享資源在被併發訪問變得有序所設計的一種規則。對於任何一種資料庫來說都需要有相應的鎖定機制,所以mysql自然也不能例外。mysql資料庫由於其自身架構的特點,存在多種資料儲存引擎,每種儲存引擎所針對的應用場景特點都不太一樣,為了滿足各自特定應用場景的需求,每種儲存引擎的鎖定機制都是為各自所面對的特定場景而優化設計,所以各儲存引擎的鎖定機制也有較大區別。mysql各儲存引擎使用了三種型別(級別)的鎖定機制:表級鎖定,行級鎖定和頁級鎖定。
3.資料庫鎖的分類
按照對資料的操作型別來分,可以分為讀鎖和寫鎖。
讀鎖:所謂的讀鎖,也叫共享鎖。針對同乙份資料,多個讀操作可以同時進行而不會相互影響。
寫鎖:所謂的寫鎖,也叫排他鎖。當前寫操作沒有完成之前,它會阻斷其他鎖的和讀鎖。
按照對資料操作的粒度來分,可以分為表鎖和行鎖以及頁鎖。
4.鎖的新增和移除
(1).建立測試資料庫表:amdin
drop table if exists `admin`;
create table `admin` (
`id` int(11) not null auto_increment,
`username` varchar(10) not null,
`password` varchar(10) not null,
primary key (`id`)
) engine=myisam default charset=utf8;
//注意這乙個資料表的引擎是myisam
建立好的資料庫表結構如下:
(2).為了方便測試,我們建立倆個資料庫會話
(3).手動新增鎖(加讀鎖或者是表鎖)
先看看表上面加過的鎖。
通過上面的命令,我們可以看見in_use的值都是0.這就是表明資料庫表沒有鎖過。
手動新增表鎖,給admin表新增乙個讀鎖,這樣我們的admin就可以共享資料。格式如下:
lock table 表名稱1 read(write),表名稱2 read(write),...
既然我們可以給我們的資料庫表加鎖,那麼我們當然也可以把我們加的鎖去掉,指令如下:
5.讀鎖案例講解
(1).給表新增乙個讀鎖
(2).操作測試
a:查詢操作
會話1對資料表進行查詢操作
會話2進行查詢操作
發現無論會話1還是會話2,都可以進行資料庫讀鎖表的查詢操作。
b.修改操作
會話1進行修改操作
發現,在鎖表的情況下,不可以對錶進行修改操作。
會話2進行資料庫表的修改操作
發現,會話2的修改操作一直處於阻塞的狀態。,然後我們在會話1把資料庫表的鎖解鎖以後,發現會話2立刻執行。
c:加了鎖的情況倆個會話是否可以去讀其他表的資料內容
會話1讀取其他的表內容
發現:無法讀取其他資料庫表的內容。
會話2讀取其他資料表的內容
發現,可以讀取其他表的資料內容。
MySQL MySQL鎖機制之寫鎖操作
1.引入 2.寫鎖案例講解 1 資料庫表內容準備 drop table if exists admin create table admin id int 11 not null auto increment,username varchar 10 not null,password varchar...
MySQL MySQL鎖機制之行鎖理論
1.引入 2.行鎖的特點 行鎖偏向於innodb儲存引擎,開銷大,加鎖慢 會出現死鎖 鎖定的粒度最小,發生鎖衝突的概率最小,併發度也最高。3.行鎖的乙個基本案例 1 建立測試資料庫表boys drop table if exists boys create table boys id int 11 ...
MySQL mysql中的鎖機制
mysql的鎖機制不同的儲存引擎支援不同的鎖機制,分為表級鎖 行級鎖 頁面鎖。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row lev...