MySQL事务的四种隔离级别,mysql中的不可重复读和幻读的区别,Repeatable read可重复读隔离级别下怎么不存在幻读问题?
1. 事務(wù)的隔離級(jí)別
1.1 read uncommited:讀未提交。一個(gè)事務(wù)讀到了另一個(gè)事務(wù)未提交的臟數(shù)據(jù),稱之為臟讀。
1.2 read commited:讀已提交。解決了臟讀問(wèn)題,但當(dāng)前事務(wù)兩次的讀取內(nèi)容由于另一個(gè)事務(wù)修改并提交而不一致,出現(xiàn)了不可重復(fù)讀。
1.3 repeatable read:可重復(fù)讀。解決了不可重復(fù)讀,也就是當(dāng)前事務(wù)讀不到其它事務(wù)修改并提交的數(shù)據(jù),從而不會(huì)出現(xiàn)不可重復(fù)讀問(wèn)題。
1.4 serializable:串行化。解決了幻讀問(wèn)題,也就是當(dāng)前事務(wù)沒(méi)有結(jié)束,其它事務(wù)無(wú)法進(jìn)行其它任何操作,串行化操作。
2. 各個(gè)隔離級(jí)別的功能驗(yàn)證
2.1 首先,MySQL的默認(rèn)隔離級(jí)別是可重復(fù)讀,如下。
2.2 讀未提交隔離級(jí)別下的操作。
雖然系統(tǒng)屬性可以作用于所有會(huì)話,但是每次系統(tǒng)屬性更改后并不能立即在當(dāng)前會(huì)話中起作用,需要退出重新進(jìn)入;所以為了不退出重新進(jìn)入,我們進(jìn)入每個(gè)會(huì)話,都對(duì)當(dāng)前會(huì)話的自動(dòng)提交和隔離級(jí)別進(jìn)行修改,操作如下。
// 更改當(dāng)前會(huì)話的隔離級(jí)別和自動(dòng)提交 set @@tx_isolation='xxx'; set @@autocommit=0;// 屬性前有g(shù)lobal是系統(tǒng)屬性值 set @@global.tx_isolation='xxx'; set @@global.autocommit=0;雖然說(shuō)變量前不加global時(shí),是會(huì)話屬性,但是我這邊修改失敗了。
總結(jié):①所以修改系統(tǒng)或會(huì)話屬性時(shí),添加對(duì)應(yīng)global或session更好,省略有時(shí)會(huì)有問(wèn)題。②每次測(cè)試完一個(gè)隔離級(jí)別后,盡可能退出重新進(jìn)入,我這邊連續(xù)測(cè)試隔離級(jí)別時(shí)會(huì)有問(wèn)題。
兩個(gè)事務(wù)進(jìn)行相應(yīng)操作,如下圖。
2.3?讀已提交隔離級(jí)別下的操作。
還是保證事務(wù)的自動(dòng)提交處于關(guān)閉狀態(tài),并且更改事務(wù)隔離級(jí)別為read-committed,如下圖;
兩個(gè)事務(wù)進(jìn)行相應(yīng)操作,如下圖。
read committed隔離級(jí)別解決了臟讀問(wèn)題,但是出現(xiàn)了不可重復(fù)讀問(wèn)題。
2.4 可重復(fù)讀隔離級(jí)別下的操作
還是保證事務(wù)的自動(dòng)提交處于關(guān)閉狀態(tài),并且更改事務(wù)隔離級(jí)別為repeatable-read,如下圖;
兩個(gè)事務(wù)進(jìn)行相應(yīng)操作,解決了不可重復(fù)讀問(wèn)題,如下圖。
以下圖片,說(shuō)明mysql的repeatable read隔離級(jí)別可以解決幻讀問(wèn)題?
repeatable read隔離級(jí)別解決了不可重復(fù)讀的問(wèn)題,同時(shí)不存在幻讀問(wèn)題,這是為什么?網(wǎng)上的教程不都說(shuō)該隔離級(jí)別存在幻讀問(wèn)題嗎?
其實(shí)這里涉及到快照讀和當(dāng)前讀內(nèi)容,上面的普通查詢語(yǔ)句屬于快照讀。快照讀:在事務(wù)首次select數(shù)據(jù)時(shí),生成快照數(shù)據(jù),之后的讀操作都會(huì)使用該快照數(shù)據(jù)(包含了其它庫(kù)和其它表的數(shù)據(jù)),因此repeatable read隔離級(jí)別下可以有效地避免不可重復(fù)讀以及讀數(shù)據(jù)的幻讀問(wèn)題,如果中途有增刪改等更新操作,仍然出現(xiàn)幻讀問(wèn)題。快照讀只在read committed和repeatable read兩種隔離級(jí)別才有,read committed隔離級(jí)別下每次讀取數(shù)據(jù)都會(huì)更新快照數(shù)據(jù),而Repeatable Read只在事務(wù)首次讀取數(shù)據(jù)生成快照數(shù)據(jù),之后讀操作都使用第一次的快照。當(dāng)前讀:也叫鎖定讀,有兩種方式:①select ... lock in share node;②select ... for update。這種查詢其實(shí)是對(duì)相應(yīng)記錄加鎖,其它事務(wù)的當(dāng)前讀以及增刪改等操作都會(huì)被阻塞,如下圖。
2.5 ①快照讀在首次讀取數(shù)據(jù)才有快照;②會(huì)對(duì)其它庫(kù)的表數(shù)據(jù)進(jìn)行“快照”,不僅僅是當(dāng)前操作數(shù)據(jù)。驗(yàn)證如下圖。
2.6 當(dāng)前讀不會(huì)出現(xiàn)幻讀問(wèn)題,因?yàn)椴僮鞫急蛔枞?/strong>,如下圖。
總結(jié)
以上是生活随笔為你收集整理的MySQL事务的四种隔离级别,mysql中的不可重复读和幻读的区别,Repeatable read可重复读隔离级别下怎么不存在幻读问题?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring核心部分之AOP,aspec
- 下一篇: linux cmake编译源码,linu