一.事務(wù)
事務(wù)是應(yīng)用程序中一系列嚴密的操作焰薄,所有操作必須成功完成拿诸,否則在每個操作中所做的所做的所有更改都會被撤銷,也就是事務(wù)具有原子性塞茅,一個事務(wù)中的一系列的操作要么全部成功亩码,要么一個都不做。
事務(wù)的結(jié)束有兩種凡桥,當事務(wù)中的所有操作步驟全部成功執(zhí)行時蟀伸,事務(wù)提交,如果其中一個步驟失敗缅刽,將發(fā)生回滾操作啊掏,撤銷到事務(wù)開始之前的操作
二.事務(wù)的四個特性
事務(wù)具有四個特性:原子性,一致性衰猛,隔離性迟蜜,持久性,這四個特性簡稱為ACID特性啡省。
1.原子性:事務(wù)是數(shù)據(jù)庫的最小的邏輯工作單位娜睛,事務(wù)中包含的各種操作髓霞,要么都做,要么都不做畦戒。
2.一致性:事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變成另一個一致性狀態(tài)方库,因此數(shù)據(jù)庫中只包含成功事務(wù)提交的結(jié)果時,就說數(shù)據(jù)庫處于一致性狀態(tài)障斋,如果數(shù)據(jù)庫運行中發(fā)生故障纵潦,有些事務(wù)尚未完成就被迫中斷,這些尚未完成的事務(wù)對數(shù)據(jù)庫所做的修改已經(jīng)有一部分寫入數(shù)據(jù)庫垃环,導(dǎo)致數(shù)據(jù)庫處于一種不正確的狀態(tài)邀层,或者說不一致的狀態(tài)。
3.隔離性:一個事務(wù)執(zhí)行時是不能被其他事務(wù)干擾遂庄,即一個事務(wù)內(nèi)部的操作和數(shù)據(jù)對其他并發(fā)的事務(wù)是隔離的寥院,并發(fā)執(zhí)行的事務(wù)之間不能干擾
4.持久性:一個事務(wù)一旦提交,他對數(shù)據(jù)的改變就是永久性的涛目,其他的操作或者故障不應(yīng)該對其結(jié)果有影響秸谢。
事務(wù)的隔離級別
讀未提交(Read uncommitted)
就是指一個事務(wù)可以讀取到另外一個事務(wù)沒有提交的事務(wù)。
事例:老板要給程序員發(fā)工資泌绣,程序員的工資是3.6萬/月钮追。但是發(fā)工資時老板不小心按錯了數(shù)字,按成3.9萬/月阿迈,該錢已經(jīng)打到程序員的戶口元媚,但是事務(wù)還沒有提交,就在這時苗沧,程序員去查看自己這個月的工資刊棕,發(fā)現(xiàn)比往常多了3千元,以為漲工資了非常高興待逞。但是老板及時發(fā)現(xiàn)了不對甥角,馬上回滾差點就提交了的事務(wù),將數(shù)字改成3.6萬再提交识樱。
分析:實際程序員這個月的工資還是3.6萬嗤无,但是程序員看到的是3.9萬。他看到的是老板還沒提交事務(wù)時的數(shù)據(jù)怜庸。這就是臟讀
三.事務(wù)的隔離級別
讀已提交(Read committed)
讀提交当犯,顧名思義,就是一個事務(wù)要等另一個事務(wù)提交后才能讀取數(shù)據(jù)割疾。
事例:程序員拿著信用卡去享受生活(卡里當然是只有3.6萬)嚎卫,當他買單時(程序員事務(wù)開啟),收費系統(tǒng)事先檢測到他的卡里有3.6萬宏榕,就在這個時候M刂睢侵佃!程序員的妻子要把錢全部轉(zhuǎn)出充當家用,并提交奠支。當收費系統(tǒng)準備扣款時馋辈,再檢測卡里的金額,發(fā)現(xiàn)已經(jīng)沒錢了(第二次檢測金額當然要等待妻子轉(zhuǎn)出金額事務(wù)提交完)胚宦。程序員就會很郁悶首有,明明卡里是有錢的…
分析:這就是讀提交,若有事務(wù)對數(shù)據(jù)進行更新(UPDATE)操作時枢劝,讀操作事務(wù)要等待這個更新操作事務(wù)提交后才能讀取數(shù)據(jù),可以解決臟讀問題卜壕。但在這個事例中您旁,出現(xiàn)了一個事務(wù)范圍內(nèi)兩個相同的查詢卻返回了不同數(shù)據(jù),這就是不可重復(fù)讀轴捎。
可重復(fù)讀(Repeatable read)
重復(fù)讀鹤盒,就是在開始讀取數(shù)據(jù)(事務(wù)開啟)時,不再允許修改操作侦副。
事例:程序員拿著信用卡去享受生活(卡里當然是只有3.6萬)侦锯,當他買單時(事務(wù)開啟,不允許其他事務(wù)的UPDATE修改操作)秦驯,收費系統(tǒng)事先檢測到他的卡里有3.6萬尺碰。這個時候他的妻子不能轉(zhuǎn)出金額了。接下來收費系統(tǒng)就可以扣款了译隘。
分析:重復(fù)讀可以解決不可重復(fù)讀問題亲桥。寫到這里,應(yīng)該明白的一點就是固耘,不可重復(fù)讀對應(yīng)的是修改题篷,即UPDATE操作。但是可能還會有幻讀問題厅目。因為幻讀問題對應(yīng)的是插入INSERT操作番枚,而不是UPDATE操作。
串行化(Serializable)
事例:程序員某一天去消費损敷,花了2千元葫笼,然后他的妻子去查看他今天的消費記錄(全表掃描FTS,妻子事務(wù)開啟)嗤锉,看到確實是花了2千元渔欢,就在這個時候,程序員花了1萬買了一部電腦瘟忱,即新增INSERT了一條消費記錄奥额,并提交苫幢。當妻子打印程序員的消費記錄清單時(妻子事務(wù)提交),發(fā)現(xiàn)花了1.2萬元垫挨,似乎出現(xiàn)了幻覺韩肝,這就是幻讀。
Serializable 是最高的事務(wù)隔離級別九榔,在該級別下哀峻,事務(wù)串行化順序執(zhí)行,可以避免臟讀哲泊、不可重復(fù)讀與幻讀剩蟀。但是這種事務(wù)隔離級別效率低下,比較耗數(shù)據(jù)庫性能切威,一般不使用育特。