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