數(shù)據(jù)庫(kù)事務(wù)(transanction)正確執(zhí)行的四個(gè)基本要素。
ACID矮嫉。原子性(Atomicity)牍疏、一致性(Correspondence)鳞陨、隔離性(Isolation)、持久性(Durability)援岩。
- 原子性:整個(gè)事務(wù)中的所有操作掏导,要么全部完成趟咆,要么全部不完成,不可能停滯在中間某個(gè)環(huán)節(jié)忍啸。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤仰坦,會(huì)被回滾(Rollback)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣计雌。
- 一致性:在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后悄晃,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞。
- 隔離性:隔離狀態(tài)執(zhí)行事務(wù),使它們好像是系統(tǒng)在給定時(shí)間內(nèi)執(zhí)行的唯一操作妈橄。如果有兩個(gè)事務(wù)庶近,運(yùn)行在相同的時(shí)間內(nèi),執(zhí)行相同的功能眷蚓,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)鼻种。這種屬性有時(shí)稱為串行化,為了防止事務(wù)操作間的混淆叉钥,必須串行化或序列化請(qǐng) 求,使得在同一時(shí)間僅有一個(gè)請(qǐng)求用于同一數(shù)據(jù)篙贸。
- 持久性:在事務(wù)完成以后投队,該事務(wù)所對(duì)數(shù)據(jù)庫(kù)所作的更改便持久的保存在數(shù)據(jù)庫(kù)之中,并不會(huì)被回滾爵川。
并發(fā)事務(wù)帶來(lái)的問(wèn)題
相對(duì)于串行處理來(lái)說(shuō)敷鸦,并發(fā)事務(wù)處理能大大增加數(shù)據(jù)庫(kù)資源的利用率,提高數(shù)據(jù)庫(kù)系統(tǒng)的事務(wù)吞吐量寝贡,從而可以支持可以支持更多的用戶扒披。但并發(fā)事務(wù)處理也會(huì)帶來(lái)一些問(wèn)題,主要包括以下幾種情況圃泡。
- 更新丟失(Lost Update):當(dāng)兩個(gè)或多個(gè)事務(wù)選擇同一行碟案,然后基于最初選定的值更新該行時(shí),由于每個(gè)事務(wù)都不知道其他事務(wù)的存在洞焙,就會(huì)發(fā)生丟失更新問(wèn)題——最后的更新覆蓋了其他事務(wù)所做的更新蟆淀。
- 臟讀(Dirty Reads):一個(gè)事務(wù)正在對(duì)一條記錄做修改,在這個(gè)事務(wù)并提交前澡匪,這條記錄的數(shù)據(jù)就處于不一致?tīng)顟B(tài);這時(shí)褒链,另一個(gè)事務(wù)也來(lái)讀取同一條記錄唁情,如果不加控制,第二個(gè)事務(wù)讀取了這些“臟”的數(shù)據(jù)甫匹,并據(jù)此做進(jìn)一步的處理甸鸟,就會(huì)產(chǎn)生未提交的數(shù)據(jù)依賴關(guān)系。這種現(xiàn)象被形象地叫做“臟讀”兵迅。
- 不可重復(fù)讀(Non-Repeatable Reads):一個(gè)事務(wù)在讀取某些數(shù)據(jù)已經(jīng)發(fā)生了改變抢韭、或某些記錄已經(jīng)被刪除了!這種現(xiàn)象叫做“不可重復(fù)讀”恍箭。
- 幻讀(Phantom Reads):一個(gè)事務(wù)按相同的查詢條件重新讀取以前檢索過(guò)的數(shù)據(jù)刻恭,卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象就稱為“幻讀”。
事物的4種隔離級(jí)別
- 1鳍贾、讀未提交(RU)
- 2鞍匾、讀已提交(RC)
- 3、可重復(fù)讀(RR)
- 4骑科、串行
事物的4種隔離級(jí)別依次會(huì)出現(xiàn)的事務(wù)問(wèn)題
更新丟失 | 臟讀 | 不可重復(fù)讀 | 幻讀 | |
---|---|---|---|---|
讀未提交 | 不存在 | 存在 | 存在 | 存在 |
讀已提交 | 不存在 | 不存在 | 存在 | 存在 |
可重復(fù)讀 | 不存在 | 不存在 | 不存在 | 存在 |
串行 | 不存在 | 不存在 | 不存在 | 不存在 |
MySQL中myisam與innodb的區(qū)別
1.InnoDB支持事物橡淑,而MyISAM不支持事物
2.InnoDB支持行級(jí)鎖,而MyISAM支持表級(jí)鎖
3.InnoDB支持MVCC, 而MyISAM不支持
4.InnoDB支持外鍵咆爽,而MyISAM不支持
5.InnoDB不支持全文索引梁棠,而MyISAM支持。
相對(duì)于其他的數(shù)據(jù)庫(kù)而言斗埂,MySQL的鎖機(jī)制比較簡(jiǎn)單掰茶,最顯著的特點(diǎn)就是不同的存儲(chǔ)引擎支持不同的鎖機(jī)制。根據(jù)不同的存儲(chǔ)引擎蜜笤,MySQL中鎖的特性可以大致歸納如下:
行鎖 | 表鎖 | 頁(yè)鎖 | |
---|---|---|---|
MyISAM | √ | ||
BDB | √ | √ | |
InnoDB | √ | √ |