MySQL高级 - 锁 - InnoDB行锁 - 介绍及背景知识
行鎖介紹
?
行鎖特點(diǎn) :偏向InnoDB 存儲(chǔ)引擎,開銷大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
InnoDB 與 MyISAM 的最大不同有兩點(diǎn):一是支持事務(wù);二是 采用了行級(jí)鎖。
背景知識(shí)
事務(wù)及其ACID屬性
事務(wù)是由一組SQL語句組成的邏輯處理單元。
事務(wù)具有以下4個(gè)特性,簡(jiǎn)稱為事務(wù)ACID屬性。
| 原子性(Atomicity) | 事務(wù)是一個(gè)原子操作單元,其對(duì)數(shù)據(jù)的修改,要么全部成功,要么全部失敗。 |
| 一致性(Consistent) | 在事務(wù)開始和完成時(shí),數(shù)據(jù)都必須保持一致狀態(tài)。 |
| 隔離性(Isolation) | 數(shù)據(jù)庫(kù)系統(tǒng)提供一定的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的 “獨(dú)立” 環(huán)境下運(yùn)行。 |
| 持久性(Durable) | 事務(wù)完成之后,對(duì)于數(shù)據(jù)的修改是永久的。 |
并發(fā)事務(wù)處理帶來的問題
| 丟失更新(Lost Update) | 當(dāng)兩個(gè)或多個(gè)事務(wù)選擇同一行,最初的事務(wù)修改的值,會(huì)被后面的事務(wù)修改的值覆蓋。 |
| 臟讀(Dirty Reads) | 當(dāng)一個(gè)事務(wù)正在訪問數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。 |
| 不可重復(fù)讀(Non-Repeatable Reads) | 一個(gè)事務(wù)在讀取某些數(shù)據(jù)后的某個(gè)時(shí)間,再次讀取以前讀過的數(shù)據(jù),卻發(fā)現(xiàn)和以前讀出的數(shù)據(jù)不一致。 |
| 幻讀(Phantom Reads) | 一個(gè)事務(wù)按照相同的查詢條件重新讀取以前查詢過的數(shù)據(jù),卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù)。 |
事務(wù)隔離級(jí)別
為了解決上述提到的事務(wù)并發(fā)問題,數(shù)據(jù)庫(kù)提供一定的事務(wù)隔離機(jī)制來解決這個(gè)問題。數(shù)據(jù)庫(kù)的事務(wù)隔離越嚴(yán)格,并發(fā)副作用越小,但付出的代價(jià)也就越大,因?yàn)槭聞?wù)隔離實(shí)質(zhì)上就是使用事務(wù)在一定程度上“串行化” 進(jìn)行,這顯然與“并發(fā)” 是矛盾的。
數(shù)據(jù)庫(kù)的隔離級(jí)別有4個(gè),由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個(gè)級(jí)別可以逐個(gè)解決臟寫、臟讀、不可重復(fù)讀、幻讀這幾類問題。
| Read uncommitted | × | √ | √ | √ |
| Read committed | × | × | √ | √ |
| Repeatable read(默認(rèn)) | × | × | × | √ |
| Serializable | × | × | × | × |
備注 : √ 代表可能出現(xiàn) , × 代表不會(huì)出現(xiàn) 。
Mysql 的數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別為 Repeatable read , 查看方式:
show variables like 'tx_isolation'; 超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的MySQL高级 - 锁 - InnoDB行锁 - 介绍及背景知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL高级 - 锁 - MyISAM
- 下一篇: linux cmake编译源码,linu