mysql--事務(wù)

事務(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ā)性能的影響也越大。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容