为什么要避免不可重复读_脏读、幻读和不可重复读?为啥?
前言:
- 一致性是指在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞。這是說(shuō)數(shù)據(jù)庫(kù)事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性以及業(yè)務(wù)邏輯上的一致性。
- 例子: 對(duì)銀行轉(zhuǎn)帳事務(wù),不管事務(wù)成功還是失敗,應(yīng)該保證事務(wù)結(jié)束后ACCOUNT表中A和B的存款總額為x元不變。
Isolation 隔離性:
- 數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同事對(duì)數(shù)據(jù)進(jìn)行操作,隔離性保證各個(gè)事務(wù)相互獨(dú)立,事務(wù)處理時(shí)的中間狀態(tài)對(duì)其它事務(wù)是不可見(jiàn)的,以此防止出現(xiàn)數(shù)據(jù)不一致?tīng)顟B(tài)。
- 例子: 在Windows中,如果多個(gè)進(jìn)程對(duì)同一個(gè)文件進(jìn)行修改是不允許的,Windows通過(guò)這種方式來(lái)保證不同進(jìn)程的隔離性。
Durable 持久性:
- 一個(gè)事務(wù)處理結(jié)束后,其對(duì)數(shù)據(jù)庫(kù)的修改就是永久性的,即使系統(tǒng)故障也不會(huì)丟失。
臟讀、幻讀和不可重復(fù)讀的概念
臟讀:
所謂臟讀是指一個(gè)事務(wù)中訪問(wèn)到了另外一個(gè)事務(wù)未提交的數(shù)據(jù),如下圖:
如果會(huì)話 2 更新 age 為 10,但是在 commit 之前,會(huì)話 1 希望得到 age,那么會(huì)獲得的值就是更新前的值。或者如果會(huì)話 2 更新了值但是執(zhí)行了 rollback,而會(huì)話 1 拿到的仍是 10。這就是臟讀。
不可重復(fù)讀:
一個(gè)事務(wù)查詢(xún)同一條記錄2次,得到的結(jié)果不一致:
由于在讀取中間變更了數(shù)據(jù),所以會(huì)話 1 事務(wù)查詢(xún)期間的得到的結(jié)果就不一樣了。
幻讀:
一個(gè)事務(wù)查詢(xún)2次,得到的記錄條數(shù)不一致:
幻讀是不可重復(fù)讀的一種特殊場(chǎng)景。
MySQL 數(shù)據(jù)隔離級(jí)別
MySQL 里有四個(gè)隔離級(jí)別:
不同事務(wù)隔離級(jí)別有不同的效果:
在 InnoDB 中,默認(rèn)為 Repeatable 級(jí)別,InnoDB 中使用一種被稱(chēng)為 next-key locking 的策略來(lái)避免幻讀(phantom)現(xiàn)象的產(chǎn)生。
隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對(duì)并發(fā)性能的影響也越大。
獲取資料:
本次給大家分享一些學(xué)習(xí)資料,里面包括:(高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)以及Java進(jìn)階學(xué)習(xí)路線圖。
關(guān)注作者,私信關(guān)鍵詞:(資料) 即可。
最后,祝大家早日學(xué)有所成!
總結(jié)
以上是生活随笔為你收集整理的为什么要避免不可重复读_脏读、幻读和不可重复读?为啥?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: maven依赖 spark sql_使用
- 下一篇: 内存告急!普通电脑遭遇前所未有灾难,求救