1.什么是事務(wù)?
訪問(wèn)并可能更新數(shù)據(jù)庫(kù)中各種數(shù)據(jù)項(xiàng)的一個(gè)程序執(zhí)行單元(unit)任岸,它通常由高級(jí)數(shù)據(jù)庫(kù)操縱語(yǔ)言或編程語(yǔ)言(如SQL纤虽,C++或Java)書寫的用戶程序的執(zhí)行所引起。當(dāng)在數(shù)據(jù)庫(kù)中更改數(shù)據(jù)成功時(shí)俺祠,在事務(wù)中更改的數(shù)據(jù)便會(huì)提交公给,不再改變借帘。否則,事務(wù)就取消或者回滾淌铐,更改無(wú)效肺然。
數(shù)據(jù)庫(kù)事務(wù)正是用來(lái)保證數(shù)據(jù)操作的平穩(wěn)性和可預(yù)測(cè)性的技術(shù)。
2.事務(wù)解釋:要做的或所做的事情
3.事務(wù)的本質(zhì):一系列操作
4.事務(wù)特征:恢復(fù)和并發(fā)控制的基本單位
5.事務(wù)的屬性:原子性,隔離性,一致性,持久性.------->ACID
1)原子性:一個(gè)事務(wù)是一個(gè)不可分割的整體匣沼,為了保證事務(wù)的總體目標(biāo)狰挡,事務(wù)必須具有原子性,即當(dāng)數(shù)據(jù)修改時(shí)释涛,要么全都執(zhí)行加叁,要么全都不執(zhí)行。即唇撬,不允許事務(wù)部分地完成它匕,避免了只執(zhí)行這些操作的一部分而帶來(lái)的錯(cuò)誤
2)一致性:一個(gè)事務(wù)在執(zhí)行之前和執(zhí)行之后,數(shù)據(jù)庫(kù)數(shù)據(jù)必須保持一致性窖认。數(shù)據(jù)庫(kù)的一致性狀態(tài)應(yīng)該滿足模式鎖指定的約束條件豫柬,那么在完整執(zhí)行該事務(wù)后,數(shù)據(jù)庫(kù)仍然處于一致性狀態(tài)
例如:銀行轉(zhuǎn)賬扑浸,轉(zhuǎn)賬前后兩個(gè)賬戶金額之和應(yīng)保持不變
3)隔離性:由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離烧给。事務(wù)查看數(shù)據(jù)庫(kù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài)喝噪,要么是另一事務(wù)修改它之后的狀態(tài)础嫡,事務(wù)不會(huì)查看中間狀態(tài)的數(shù)據(jù)
4)持久性:事務(wù)完成以后,DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))保證它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的修改是永久性的酝惧,當(dāng)系統(tǒng)或介質(zhì)發(fā)生故障時(shí)榴鼎,該修改也永久保持。持久性一般通過(guò)數(shù)據(jù)庫(kù)備份與恢復(fù)來(lái)保證.
一般情況下晚唇,通過(guò)執(zhí)行COMMIT(提交)或ROLLBACK(回滾)語(yǔ)句來(lái)終止事務(wù)巫财。當(dāng)執(zhí)行COMMIT語(yǔ)句時(shí),自從事務(wù)啟動(dòng)以來(lái)對(duì)數(shù)據(jù)庫(kù)所做的一切更改就成為永久性的哩陕,即被寫入到磁盤平项,而當(dāng)執(zhí)行ROLLBACK語(yǔ)句時(shí),自從事務(wù)啟動(dòng)以來(lái)對(duì)數(shù)據(jù)庫(kù)所做的一切更改都會(huì)被撤銷悍及,并且數(shù)據(jù)庫(kù)中內(nèi)容返回到事務(wù)開(kāi)始之前所處的狀態(tài)葵礼。無(wú)論什么情況,在事務(wù)完成時(shí)并鸵,都能保證回到一致性狀態(tài)鸳粉。
6.事務(wù)執(zhí)行的方式
1)串行控制:如果事務(wù)是順序執(zhí)行的,即一個(gè)事務(wù)完成之后再進(jìn)行下一個(gè)事務(wù).
2)并行控制:同時(shí)接受多個(gè)事務(wù),并且這些事務(wù)在時(shí)間上可以重疊執(zhí)行,但是并發(fā)操作有可能會(huì)破壞其ACID特性.
7.并發(fā)控制帶來(lái)的數(shù)據(jù)不一致性的種類:
1)臟讀------>事務(wù)未commit,另一個(gè)事務(wù)讀取數(shù)據(jù)
一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù)园担,并且對(duì)數(shù)據(jù)進(jìn)行了修改届谈,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中枯夜,這時(shí),另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù)艰山,然后使用了這個(gè)數(shù)據(jù)湖雹。
2)不可重復(fù)讀
一個(gè)事務(wù)對(duì)同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果.
兩種現(xiàn)象:
A.虛讀:
事務(wù)T1讀取某一數(shù)據(jù)后曙搬,事務(wù)T2對(duì)其做了修改摔吏,當(dāng)事務(wù)T1再次讀取該數(shù)據(jù)時(shí)得到與前一次不同的值
B.幻度:
事務(wù)在操作過(guò)程中進(jìn)行兩次查詢,第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)或者缺少了第一次查詢中出現(xiàn)的數(shù)據(jù)纵装。這是因?yàn)樵趦纱尾樵冞^(guò)程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的
3)更新丟失
兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù)征讲,一個(gè)事務(wù)對(duì)數(shù)據(jù)的更新把另一個(gè)事務(wù)對(duì)數(shù)據(jù)的更新覆蓋了
8.避免上面出現(xiàn)的問(wèn)題,提出了4種事務(wù)隔離機(jī)制
1)讀未提交(Read Uncommitted):
只處理更新丟失。如果一個(gè)事務(wù)已經(jīng)開(kāi)始寫數(shù)據(jù)橡娄,則不允許其他事務(wù)同時(shí)進(jìn)行寫操作诗箍,但允許其他事務(wù)讀此行數(shù)據(jù)。可通過(guò)“排他寫鎖”實(shí)現(xiàn)挽唉。
實(shí)例:公司發(fā)工資,領(lǐng)導(dǎo)把100元打到了小王的賬號(hào)上,但是沒(méi)有提交事務(wù),小王正好查看余額,發(fā)現(xiàn)工資是100,非常高興.但是領(lǐng)導(dǎo)發(fā)現(xiàn)發(fā)給小王的工資金額不對(duì),工資應(yīng)該是50,于是回滾了事務(wù),修改了吟哦,在提交了事務(wù),最后實(shí)際金額是50,小王空歡喜了.
出現(xiàn)上述情況:這就是臟讀的現(xiàn)場(chǎng),事務(wù)B讀取了事務(wù)A未提交的數(shù)據(jù).
因此,讀未提交會(huì)出現(xiàn)臟讀的現(xiàn)象.
2)讀提交(Read Committed):
處理更新丟失滤祖、臟讀。讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問(wèn)改行數(shù)據(jù)瓶籽,但是未提交的寫事務(wù)將會(huì)禁止其他事務(wù)訪問(wèn)改行匠童。可通過(guò)“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn).
實(shí)例:小王去吃飯結(jié)賬,系統(tǒng)讀取卡里有50,而此時(shí)他的老婆也正好在網(wǎng)上轉(zhuǎn)賬,把小王工資卡的50元轉(zhuǎn)到另一賬戶,并在小王之前提交了事務(wù),當(dāng)小王扣款時(shí),系統(tǒng)檢查到小王的工資卡已經(jīng)沒(méi)有錢,扣款失敗,小王十分納悶,明明卡里有錢,為什么會(huì)出現(xiàn)這個(gè)問(wèn)題.
出現(xiàn)這個(gè)情況:這就是不可重復(fù)讀取現(xiàn)象,兩個(gè)并發(fā)的事務(wù)塑顺,“事務(wù)A:小王消費(fèi)”俏让、“事務(wù)B:小王的老婆網(wǎng)上轉(zhuǎn)賬”,事務(wù)A事先讀取了數(shù)據(jù)茬暇,事務(wù)B緊接了更新了數(shù)據(jù),并提交了事務(wù)寡喝,而事務(wù)A再次讀取該數(shù)據(jù)時(shí)糙俗,數(shù)據(jù)已經(jīng)發(fā)生了改變。
因此:Read committed?時(shí)预鬓,避免了臟讀巧骚,但是可能會(huì)造成不可重復(fù)讀
3)可重復(fù)讀取(Repeatable Read):
處理更新丟失、臟讀和不可重復(fù)讀取格二。讀取數(shù)據(jù)的事務(wù)將會(huì)禁止寫事務(wù)劈彪,但允許讀事務(wù),寫事務(wù)則禁止任何其他事務(wù)顶猜。可通過(guò)“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)沧奴。
實(shí)例: 當(dāng)隔離級(jí)別設(shè)置為Repeatable read?時(shí),可以避免不可重復(fù)讀长窄。當(dāng)小王拿著工資卡去消費(fèi)時(shí),一旦系統(tǒng)開(kāi)始讀取工資卡信息(即事務(wù)開(kāi)始),小王的老婆就不可能對(duì)該記錄進(jìn)行修改,也就是小王的老婆不能在此時(shí)轉(zhuǎn)賬滔吠。
雖然Repeatable read避免了不可重復(fù)讀纲菌,但還有可能出現(xiàn)幻讀?。
小王的老婆工作在銀行部門,她時(shí)常通過(guò)銀行內(nèi)部系統(tǒng)查看小王的信用卡消費(fèi)記錄疮绷。有一天,她正在查詢到小王當(dāng)月信用卡的總消費(fèi)金額 (select sum(amount) from transaction where month = 本月)為80元翰舌,而小王此時(shí)正好在外面胡吃海塞后在收銀臺(tái)買單,消費(fèi)1000元,即新增了一條1000元的消費(fèi)記錄(insert transaction ... ),并提交了事務(wù),隨后小王的老婆將小王當(dāng)月信用卡消費(fèi)的明細(xì)打印到A4紙上,卻發(fā)現(xiàn)消費(fèi)總額為1080元,小王的老婆很詫異,以為出 現(xiàn)了幻覺(jué),幻讀就這樣產(chǎn)生了冬骚。
4)序列化(Serializable):
提供嚴(yán)格的事務(wù)隔離,執(zhí)行串行控制椅贱。要求失去序列化執(zhí)行,事務(wù)只能一個(gè)接一個(gè)地執(zhí)行只冻,不能并發(fā)執(zhí)行庇麦。僅僅通過(guò)“行級(jí)鎖”是無(wú)法實(shí)現(xiàn)事務(wù)序列化的,必須通過(guò)其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作的事務(wù)訪問(wèn)到属愤。
在該級(jí)別下女器,事務(wù)順序執(zhí)行,不僅可以避免臟讀住诸、不可重復(fù)讀驾胆,還避免了幻像讀.
9.數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別由低到高依次為:
Read uncommitted <? Read committed <Repeatable read <Serializable
讀未提交? < 讀提交 < 可重復(fù)讀取〖拧<?序列化
10.隔離級(jí)別中可能出現(xiàn)的問(wèn)題
11.隔離級(jí)別總結(jié):
隔離級(jí)別越高丧诺,越能保證數(shù)據(jù)的完整性和統(tǒng)一性,但是對(duì)并發(fā)性能的影響也越大奄薇。對(duì)于多數(shù)應(yīng)用程序驳阎,可以優(yōu)先考慮把數(shù)據(jù)庫(kù)系統(tǒng)的隔離級(jí)別設(shè)為Read Committed。它能夠避免臟讀馁蒂,而且具有較好的并發(fā)性能呵晚。盡管它會(huì)導(dǎo)致不可重復(fù)讀、幻讀和第二類丟失更新這些并發(fā)問(wèn)題沫屡,在可能出現(xiàn)這類問(wèn)題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采用悲觀鎖或樂(lè)觀鎖來(lái)控制