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).手動添加鎖(加讀鎖或者是表鎖)
先看看錶上面加過的鎖。
show open tables;
通過上面的命令,我們可以看見In_use的值都是0.這就是表明數據庫表沒有鎖過。
手動添加表鎖,給admin表添加一個讀鎖,這樣我們的admin就可以共享數據。格式如下:
lock table 表名稱1 read(write),表名稱2 read(write),...
既然我們可以給我們的數據庫表加鎖,那麼我們當然也可以把我們加的鎖去掉,指令如下:
unlock tables;
5.讀鎖案例講解
(1).給表添加一個讀鎖
(2).操作測試
A:查詢操作
會話1對數據表進行查詢操作
會話2進行查詢操作
發現無論會話1還是會話2,都可以進行數據庫讀鎖表的查詢操作。
B.修改操作
會話1進行修改操作
發現,在鎖表的情況下,不可以對錶進行修改操作。
會話2進行數據庫表的修改操作
發現,會話2的修改操作一直處於阻塞的狀態。,然後我們在會話1把數據庫表的鎖解鎖以後,發現會話2立刻執行。
C:加了鎖的情況倆個會話是否可以去讀其他表的數據內容
會話1讀取其他的表內容
發現:無法讀取其他數據庫表的內容。
會話2讀取其他數據表的內容
發現,可以讀取其他表的數據內容。