1、讀未提交
最容易出現(xiàn)的是臟讀,是指當(dāng)前事務(wù)可以讀取到其它未提交的事務(wù)。舉個(gè)??:
老板張三給員工李四發(fā)工資時(shí)多打了一個(gè)零,本來是發(fā)3000的變成發(fā)30000,此時(shí)的李四正在跟女朋友逛街,查詢余額的時(shí)候李四菊花一緊,口吐芬芳,大喊一聲:臥槽!對(duì)著女朋友說:盡管買。但是老板張三發(fā)工資的時(shí)候事務(wù)并沒有提交,他立刻進(jìn)行了事務(wù)回滾,竹南打水一場(chǎng)空,李四抱頭大哭工資又變成3000了。

這個(gè)時(shí)候李四讀取到的數(shù)據(jù)就是典型的臟數(shù)據(jù),產(chǎn)生的原因是讀取了其他未提交的數(shù)據(jù)。
2、讀提交
為了解決臟讀的問題,咱們吧事務(wù)的隔離級(jí)別調(diào)整為讀提交,它是為了
保證當(dāng)前事務(wù)只能讀到其他已經(jīng)提交完的事務(wù),但是這樣會(huì)面臨個(gè)新問題,不可重復(fù)讀。舉個(gè)??:
李四帶著自己心愛的女朋友去商場(chǎng)消費(fèi),買單的時(shí)候(開啟事務(wù)),系統(tǒng)檢測(cè)李四的銀行卡里面有5000塊錢。這個(gè)時(shí)候李四的女朋友正在拿李四的手機(jī)逛淘寶買衣服一下子買了4000(敗家娘們),當(dāng)李四準(zhǔn)備扣費(fèi)的時(shí)候,再次查詢余額,發(fā)現(xiàn)只剩下1000塊錢了,當(dāng)時(shí)李四臉都綠了?。。。ㄟ@個(gè)查詢是發(fā)生在女朋友買完衣服之后)

像這樣的問題,在同一個(gè)事務(wù)下,李四的金額在不同的時(shí)候讀取出來的值是不一樣的,這就是不可重復(fù)度問題。
3、可重復(fù)讀
在可重復(fù)度的情況下,當(dāng)前事務(wù)會(huì)禁止其余事務(wù)對(duì)正在操作的數(shù)據(jù)進(jìn)行更新,這樣一
來,哎嘿,女朋友消費(fèi)的事務(wù)就要等到李四帳號(hào)扣費(fèi)結(jié)束后才能進(jìn)行,這樣不可
重復(fù)度的問題就解決了,但是這樣一來,又會(huì)出現(xiàn)個(gè)新的問題,幻讀。舉個(gè)??:
李四跟女朋友吵架了,李四傷心欲絕,決定在網(wǎng)上買了個(gè)充氣娃娃,消費(fèi)了1000大洋,當(dāng)晚女朋友查看李四今天的消費(fèi)記錄(開啟事務(wù)),發(fā)現(xiàn)一共消費(fèi)了1000大洋,這個(gè)時(shí)候李四發(fā)現(xiàn)良心過不去,吧充氣娃娃的訂單退掉,又花了10000塊買了個(gè)包包準(zhǔn)備為女朋友道歉,(女朋友的事務(wù)還在進(jìn)行中)當(dāng)女朋友打印李四的消費(fèi)訂單的時(shí)候,發(fā)現(xiàn)莫名其妙的變成了10000塊錢,而且多了一條消費(fèi)記錄。

像這種當(dāng)前事務(wù)還在進(jìn)行中的時(shí)候,由于別的事務(wù)進(jìn)行了刪除或者新增的操作,導(dǎo)致當(dāng)前的數(shù)據(jù)變多或者變少的情況,就叫做換讀。
4、串行化
當(dāng)事務(wù)隔離級(jí)別設(shè)置為串行化的時(shí)候,所有事務(wù)都是串行執(zhí)行的,對(duì)應(yīng)上面的??:
女朋友在查看當(dāng)天消費(fèi)記錄的時(shí)候,李四是不允許消費(fèi)的,這么一來事務(wù)并發(fā)帶來的問題也能得到相對(duì)應(yīng)的解決,但是效率特別低。

5、擴(kuò)展
用大白話解釋了事務(wù)的隔離級(jí)別之后,想提醒廣大程序員:在常用的數(shù)據(jù)庫(kù)Oracle默認(rèn)的事務(wù)隔離級(jí)別是讀提交,MySQL的是可重復(fù)讀,在MySQL的InnoDB引擎中,雖然事務(wù)隔離級(jí)別是可重復(fù)讀,但是也是可以解決幻讀滴,背后的原理是在數(shù)據(jù)行之間添加了間縫鎖,是為了防止數(shù)據(jù)的插入跟刪除(沒深入研究過),至于具體用那一種事務(wù)隔離,要看具體的業(yè)務(wù)需求啦!