Mysql-事務,鎖篇

前面探究了mysql的數據結構和索引,本文咱們來學習一下mysql中事務和鎖方面的知識。總結了一些點,方便溫故知新mysql

事務

1. ACID四大特性算法

Atomicity:原子性
事務中的操做要麼所有成功要麼所有失敗
Consistency:一致性
一個事務在執行先後,數據庫都必須保持一致性,數據庫只包含成功提交事務的結果
Isolation:隔離性
事務的執行是相互隔離的,不被幹擾的
Durability:持久性
事務提交後,對數據的修改必須是永久保存的sql

2. 隔離級別數據庫

未提交讀(READ UNCOMMITTED)事務能夠讀取其餘未提交事務中修改的數據,會發生髒讀,不可重複讀,幻讀
已提交讀(READ COMMITTED)事務只能讀取其餘已提交事務修改的數據,能夠解決髒讀(讀取的數據是別的未提交事務修改的數據)
可重複讀(REPEATABLE READ)在事務開啓時,再也不容許修改操做,一個事務屢次讀取同一數據獲得的結果是一致的,能夠解決不可重複讀(一個事務進行2次查詢,中間有別的事務進行了修改操做,致使兩次查詢的結果不一樣)
可串行化(SERIALIZABLE)事務串行執行,不能併發執行,能夠解決幻讀(一個事務進行2次查詢,中間有別的事務進行了新增或刪除操做,致使獲得了不一樣條數的數據)數據結構

共享鎖(讀鎖)
容許多個事務共享一把鎖,可是對於加鎖的數據只能讀取,不能進行UPDATE DETELE等操做
lock in share mode能夠添加共享鎖併發

排他鎖(寫鎖)
只有一個事務能拿到排他鎖,其餘事務不能獲取到鎖,會阻塞直到持有鎖的事務釋放鎖或者等待超時,不能與其餘鎖共存
InnoDB會對update,insert,delete語句自動加排它鎖
select ... for update也會添加排他鎖
其餘事務能夠正常執行select語句,由於select不涉及加鎖(有些文章模糊了這塊的概念,強調排他鎖事務未提交時,其餘事務不能對鎖住的數據進行任何操做,我在實驗事後發現不加for update的查詢操做是能夠執行的)學習

意向共享鎖/意向排他鎖
在事務獲取共享鎖或排他鎖以前,會對整張表先加鎖,意向鎖存在的意義是支持行鎖和表鎖共存對象

鎖算法

Record Lock(記錄鎖)
對記錄上的索引加鎖,能夠理解爲行鎖索引

Gap Lock(間隙鎖)
間隙鎖,只對索引的間隙加鎖,可是不包括索引自己,只有RR隔離級別以上才支持間隙鎖事務

Next-Key Lock(臨鍵鎖)
Record Lock+Gap Lock,不只對索引加鎖,也對索引的間隙加鎖(左開右閉),InnoDB利用Next-Key Lock來解決幻讀問題

加鎖規則

1. next-key lock 是前開後閉區間((x,y])。
2. 查找過程當中訪問到的對象纔會加鎖。
3. 索引上的等值查詢,給惟一索引加鎖的時候,next-key lock 退化爲行鎖。
4. 索引上的等值查詢,向右遍歷時且最後一個值不知足等值條件的時候,next-key lock 退化爲間隙鎖。
5. 惟一索引上的範圍查詢會訪問到不知足條件的第一個值爲止

舉例:
假設咱們有張只有主鍵id的表,表的數據爲1,2,3,4,5,6,9,11,咱們看看不一樣的sql下,加鎖的結果是什麼

select * from user where id =8 for update
8介於索引6 9之間,next-key lock前開後閉(6,9],又由於右邊最後一個值9不等於8,因此next-key lock退化成間隙鎖(6,9)

select * from user where id =9 for update
由於是惟一索引等值查詢,退化成行鎖

select * from user where id >6
根據第五條規則,next-key lock範圍(6,+MAXVALUE]

select * from user where id >=6
由於6是等值查詢,因此須要加行鎖,next-key lock範圍[6,MAXVALUE]

select * from user where id >7
介於6以前,因此next-key lock範圍(6,MAXVALUE]

select * from user where id >6 and id <8由於規則5,第一個不知足查詢條件的是9,因此next-key lock範圍(6,9]

相關文章
相關標籤/搜索