鎖機制是數(shù)據(jù)庫與文件系統(tǒng)最大的差別了,而不同的數(shù)據(jù)庫,不同的引擎鎖機制也有所不同,由于MySQL的MyISAM用的場景比較少,所以這里只介紹InnoDB的相關(guān)內(nèi)容
事務
事務是數(shù)據(jù)庫管理系統(tǒng)執(zhí)行過程中的一個邏輯單元,有有限的操作序列組成
ACID特性
-
原子性
事務作為一個整體被執(zhí)行,包含在事務中的對數(shù)據(jù)庫的操作要么全執(zhí)行,要么全不執(zhí)行
-
一致性
事務應確保數(shù)據(jù)庫的狀態(tài)從一個一致的狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致狀態(tài),一致狀態(tài)指數(shù)據(jù)庫中的數(shù)據(jù)應滿足約束
-
隔離性
多個事務并發(fā)執(zhí)行時,一個事務執(zhí)行不應影響其他事務的執(zhí)行
-
持久性
已被提交的事務對數(shù)據(jù)庫的修改應該被永久保存到數(shù)據(jù)庫中
事務的隔離級別
-
read uncommited(dirty read)
讀未提交,事務可以看到其他事務更改了但是還沒提交的數(shù)據(jù),存在臟讀(事務2讀到了事務1修改但未提交的數(shù)據(jù),后事務1撤銷了修改,即修改不存在了)
-
read commited
讀提交,事務可以看到在它執(zhí)行時,其他事務已經(jīng)提交的數(shù)據(jù),允許不可重復讀(執(zhí)行兩次相同的查詢結(jié)果不一致),但不允許臟讀
-
repeatable read
可重復讀,同一個事務內(nèi),同一個請求,多次執(zhí)行獲得的記錄是相同的,不能杜絕幻讀(事務1修改了整表,事務2插入了一條新的數(shù)據(jù),事務1發(fā)現(xiàn)新的數(shù)據(jù)沒有被修改,產(chǎn)生幻覺)
-
serializable
解決了幻讀,將鎖施加在所有訪問的數(shù)據(jù)上,最高級別的鎖
為什么要先提到事務?首先要想清楚數(shù)據(jù)庫的鎖是干嘛的,就是為了避免多個事務并發(fā)執(zhí)行修改或查詢操作時導致數(shù)據(jù)庫出現(xiàn)異常錯誤的而設(shè)置的方式,有了鎖可以減少一些問題,比如幻讀,臟讀,但是不同的鎖級別當然也不能解決所有的問題,所以要根據(jù)業(yè)務環(huán)境和表的結(jié)構(gòu)靈活運用.
(未完)