數(shù)據(jù)庫(kù)事務(wù)和四種隔離級(jí)別

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)題

隔離級(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)控制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饵隙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沮脖,更是在濱河造成了極大的恐慌金矛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺届,死亡現(xiàn)場(chǎng)離奇詭異驶俊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)免姿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門饼酿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胚膊,你說(shuō)我怎么就攤上這事嗜湃∧斡Γ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵购披,是天一觀的道長(zhǎng)杖挣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)刚陡,這世上最難降的妖魔是什么惩妇? 我笑而不...
    開(kāi)封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮筐乳,結(jié)果婚禮上歌殃,老公的妹妹穿的比我還像新娘。我一直安慰自己蝙云,他們只是感情好氓皱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著勃刨,像睡著了一般波材。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上身隐,一...
    開(kāi)封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天廷区,我揣著相機(jī)與錄音,去河邊找鬼贾铝。 笑死隙轻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垢揩。 我是一名探鬼主播玖绿,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叁巨!你這毒婦竟也來(lái)了斑匪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俘种,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绝淡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宙刘,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年牢酵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悬包。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馍乙,死狀恐怖布近,靈堂內(nèi)的尸體忽然破棺而出垫释,到底是詐尸還是另有隱情,我是刑警寧澤撑瞧,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布棵譬,位于F島的核電站,受9級(jí)特大地震影響预伺,放射性物質(zhì)發(fā)生泄漏订咸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一酬诀、第九天 我趴在偏房一處隱蔽的房頂上張望脏嚷。 院中可真熱鬧,春花似錦瞒御、人聲如沸父叙。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)趾唱。三九已至,卻和暖如春践宴,著一層夾襖步出監(jiān)牢的瞬間鲸匿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工阻肩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留带欢,地道東北人烤惊。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓乔煞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柒室。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渡贾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容