mysql資料庫入門 鎖入門

2021-10-12 09:26:50 字數 2936 閱讀 9955

鎖分類

按鎖定粒度劃分。分為行級鎖、表級鎖、間隙鎖。 

按排斥性劃分。分為共享鎖(s鎖)、排他鎖(x鎖)。

按是否上鎖劃分。樂觀鎖、悲觀鎖  

鎖概念解釋

行級鎖  顧名思義:鎖定的是單行記錄。按照索引進行ddl的時候此時使用的是行級鎖。

表級鎖  顧名思義:鎖定的是整個表。因為無法縮小查詢範圍,需要進行全表掃瞄。

間隙鎖  在rr級別下會在一定情況下對部分操作使用間隙鎖(參考下方)。會根據唯一索引的資料大小把資料劃分為範圍進行鎖定。如id列的值為 1,3,5。則劃分為 負無窮至1, 1至3, 3至5,5至正無窮(前開後閉原則,第二個包圍包括3,但是不包括5),其他類推。此時執行update table set col = 1 where id = 3, 則會鎖定住3至5的範圍。進行insert into(4) 這個操作需要進行等待。   間隙鎖的引入是為了解決幻讀問題的。

共享鎖(s鎖)select in share mode使用共享鎖。 共享鎖會在讀取完之後立即釋放。

排他鎖  (x鎖)  select for update、insert、update、delete 使用排他鎖。 排他鎖是在事務結束後釋放。  正常的select 是沒有鎖的。採取mvcc的方式進行讀取。

樂觀鎖  在查詢的時候不進行新增索。然後再更新的時候通過版本號字段進行判斷。 如先查詢 select version from table where id = 1, 然後更新的時候把version當作更新條件 update table set version = version + 1, col = x where id = 1 and version = 之前查到的version。 業務上注意新增沒更新成功時的判斷邏輯

悲觀鎖  再乙個事務中查詢進行加索操作。 比如 select for update

語句加索情況分析

1)聚簇索引(查詢命中)

rc、rr都是對聚簇索引加x鎖。

2)聚簇索引(查詢未命中)

rc不加鎖,rr在16之前和之後的範圍裡加gap鎖。

3)二級唯一索引(查詢命中)

rc、rr會對二級和聚簇索引都加x鎖(防止其他事務通過聚簇改資料)。

4)二級唯一索引(查詢未命中)

update students set score = 100 where no = 's0008';
rc不加鎖,rr只在二級索引加gap。

5)二級非唯一索引(查詢命中)

rc對二級和聚簇加x鎖,rr對二級加x鎖和gap對聚簇加x鎖。

6)二級非唯一索引(查詢未命中)

rc不加鎖,rr只在二級索引加gap。

死鎖

死鎖案例一

死鎖案例二

25和26記錄都不存在,a和b並沒有更新任何記錄,但是由於資料庫隔離級別為rr,所以會在 (20, 30) 之間加上間隙鎖。之後a和b分別執行 insert 要插入25和26,需要在 (20, 30) 之間加插入意向鎖,插入意向鎖和間隙鎖衝突,所以兩個事務互相等待,最後形成死鎖。

死鎖案例三

加鎖是一條記錄一條記錄挨個加鎖,如果兩條 sql 語句的加鎖順序不一樣,也可能會導致死鎖。a 的加鎖順序為:id = 20 -> 30,b 的加鎖順序為:id = 30 -> 20,正好相反,所以會導致死鎖。

死鎖如何處理

設定事務等待時間  innodb_lock_wait_timeout

規範編碼  盡量保證事務中鎖的順序性,從而避免ab-ba問題。

show full processlist 檢視一直在等待的程序,然後kill

wait for graph 可以判斷當前是否發生了死鎖

鎖公升級(innodb不存在鎖公升級)

跟mysql的鎖定使用位圖方式有關。鎖並不是稀缺資源。

Mysql 資料庫入門

1 mysql資料庫服務的啟動與登入 mysql 伺服器啟動方式有兩種 通過服務的方式自動啟動 手動啟動的方式 1.1 windows 服務方式啟動 1.1.1 操作步驟 1.2 dos 命令方式啟動 1.2.1 操作步驟 1.3 控制台連線資料庫 mysql 是乙個需要賬戶名密碼登入的資料庫,登陸...

MySql資料庫入門

1.1外來鍵的作用 alter table school stu add constraint pk stu stuid primary key school stu stuid 外來鍵 外來鍵 在一張表中的某個字段引用的資料來自另一張表的某個欄位的資訊。主表 它的主鍵一般是需要被從表引用 從表 在...

資料庫 MySQL入門

一定方式儲存在一起 能與多個使用者共享 具有盡可能小的冗餘度 與應用程式彼此獨立的資料集合 資料庫管理系統 簡稱dbms 是為管理資料庫而設計的電腦軟體系統,一般具有儲存 擷取 安全保障 備份等基礎功能 分類 關聯式資料庫和非關聯式資料庫 區別 關係型和非關係型資料庫的主要差異是資料儲存的方式。關係...