由低到高分別為Read uncommitted 、Read committed 、Repeatable read 赞咙、Serializable
Read uncommitted:
? ??一個事務(wù)可以讀取另一個未提交事務(wù)的數(shù)據(jù),就是所謂的臟讀仙畦。
Read committed:
讀提交,顧名思義,就是一個事務(wù)要等另一個事務(wù)提交后才能讀取數(shù)據(jù)
這就是讀提交,若有事務(wù)對數(shù)據(jù)進(jìn)行更新(UPDATE)操作時靠欢,讀操作事務(wù)要等待這個更新操作事務(wù)提交后才能讀取數(shù)據(jù),可以解決臟讀問題南片。但在這個事例中掺涛,出現(xiàn)了一個事務(wù)范圍內(nèi)兩個相同的查詢卻返回了不同數(shù)據(jù)庭敦,這就是不可重復(fù)讀
Repeatable read:
重復(fù)讀疼进,就是在開始讀取數(shù)據(jù)(事務(wù)開啟)時,不再允許修改操作
重復(fù)讀可以解決不可重復(fù)讀問題秧廉。寫到這里伞广,應(yīng)該明白的一點(diǎn)就是,不可重復(fù)讀對應(yīng)的是修改疼电,即UPDATE操作嚼锄。但是可能還會有幻讀問題。因?yàn)榛米x問題對應(yīng)的是插入INSERT操作蔽豺,而不是UPDATE操作
什么時候會出現(xiàn)幻讀区丑?
事例:程序員某一天去消費(fèi),花了2千元修陡,然后他的妻子去查看他今天的消費(fèi)記錄(全表掃描FTS沧侥,妻子事務(wù)開啟),看到確實(shí)是花了2千元魄鸦,就在這個時候宴杀,程序員花了1萬買了一部電腦,即新增INSERT了一條消費(fèi)記錄拾因,并提交旺罢。當(dāng)妻子打印程序員的消費(fèi)記錄清單時(妻子事務(wù)提交)旷余,發(fā)現(xiàn)花了1.2萬元,似乎出現(xiàn)了幻覺扁达,這就是幻讀正卧。
那怎么解決幻讀問題?Serializable跪解!
Serializable 序列化
Serializable 是最高的事務(wù)隔離級別穗酥,在該級別下,事務(wù)串行化順序執(zhí)行惠遏,可以避免臟讀砾跃、不可重復(fù)讀與幻讀。但是這種事務(wù)隔離級別效率低下节吮,比較耗數(shù)據(jù)庫性能抽高,一般不使用。
值得一提的是:大多數(shù)數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別是Read committed透绩,比如Sql Server , Oracle翘骂。Mysql的默認(rèn)隔離級別是Repeatable read。
以上這四種隔離級別都是拒絕并發(fā)修改的帚豪,比如MySQL的InnoDB引擎碳竟,會在修改表的時候加表鎖或行鎖,此時其他修改被鎖數(shù)據(jù)的請求是會被阻塞的狸臣,直到鎖被釋放才會執(zhí)行莹桅。對于并發(fā)讀寫,這四種隔離級別的要求各不相同烛亦,前三種是允許并發(fā)讀寫的诈泼,即當(dāng)有Session在修改表的時候,仍有Session可以讀取數(shù)據(jù)煤禽,第四種串行化是拒絕并發(fā)讀寫的铐达,無論是讀還是寫,都必須要以串行的方式執(zhí)行(當(dāng)然是一種非常低效的方式檬果,很少使用瓮孙,并發(fā)度非常低,但最大限度地保證了數(shù)據(jù)一致性)选脊。
https://blog.csdn.net/songxinjianqwe/article/details/72789899?locationNum=15&fps=1原文