事務(wù)的基本要素(ACID):??
? ??????原子性:一個事務(wù)包含多個操作,這些操作要么全部執(zhí)行,要么全都不執(zhí)行。實現(xiàn)事務(wù)的原子性,要支持回滾操作,在某個操作失敗后,回滾到事務(wù)執(zhí)行之前的狀態(tài)。
? ??????一致性:數(shù)據(jù)庫總是從一個一致的狀態(tài)轉(zhuǎn)換到另一個一致狀態(tài)(以轉(zhuǎn)錢為例)
? ??????隔離性:并發(fā)事務(wù)之間互相影響的程度,比如一個事務(wù)會不會讀取到另一個未提交的事務(wù)修改的數(shù)據(jù)
????????持久性: 事務(wù)提交后,對系統(tǒng)的影響是永久的
事務(wù)的并發(fā)問題:
? ? ? ? ?臟讀:當(dāng)前事務(wù)看到了別的事務(wù)未提交的數(shù)據(jù)(側(cè)重點在于別的事務(wù)未提交)
? ? ? ? 不可重復(fù)讀:不可重復(fù)讀的側(cè)重點在于更新修改數(shù)據(jù)。表示在同一事務(wù)中,查詢相同的數(shù)據(jù)源時,其結(jié)果不一致????例如:事務(wù)A多次讀取同一數(shù)據(jù),事務(wù)B在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時,結(jié)果不一致。
? ? ? ? 幻讀:幻讀的側(cè)重點在于新增和刪除。表示在同一個事務(wù)中,使用相同的查詢語句,第二次查詢時,莫名的多出了一些之前不存在的數(shù)據(jù)(或者莫名的少了一些數(shù)據(jù)) 例如:A將數(shù)據(jù)庫中所有學(xué)生的分?jǐn)?shù)改為ABCDE等級,但是B就在此時插入了一條分?jǐn)?shù)的記錄。當(dāng)A修改結(jié)束后發(fā)現(xiàn)這條新增的沒有改過來,就好像發(fā)生了幻覺一樣
????????小結(jié):不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
MySQL的四種事務(wù)隔離級別(默認(rèn)為可重復(fù)讀-RR)

? ??????讀未提交(read-uncommitted)?:隔離級別:0. 可以讀取未提交的記錄。會出現(xiàn)臟讀。
? ????? 不可重復(fù)讀(read-committed?):隔離級別:1. 事務(wù)中只能看到已提交的修改。不可重復(fù)讀,會出現(xiàn)幻讀。該隔離級別是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別,但是MySQL的則是RR。
? ??????可重復(fù)讀?(repeatable-read):隔離級別:2. 通過Next-key lock(行鎖和間隙鎖)和mvcc機制來解決部分幻讀問題。
? ??????可串行化(serializable):隔離級別:3. 該隔離級別會在讀取的每一行數(shù)據(jù)上都加上鎖,退化為基于鎖的并發(fā)控制,即LBCC
注意:
1、事務(wù)隔離級別為讀未提交時,寫數(shù)據(jù)只會鎖住相應(yīng)的行
2、事務(wù)隔離級別必須為可重復(fù)讀,如果檢索條件有索引(包括主鍵索引)的時候,默認(rèn)加鎖方式是Next-key lock(行鎖和間隙鎖);如果檢索條件沒有索引,更新數(shù)據(jù)時會鎖住整張表。一個間隙被事務(wù)加了鎖,其他事務(wù)是不能在這個間隙插入記錄的,這樣可以防止幻讀。
3、事務(wù)隔離級別為串行化時,讀寫數(shù)據(jù)都會鎖住整張表
4、隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對并發(fā)性能的影響也越大。