数据库事务的隔离机制
生活随笔
收集整理的這篇文章主要介紹了
数据库事务的隔离机制
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
數(shù)據(jù)庫(kù)事務(wù)(Database Transaction) ,是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。----百度百科就是說(shuō)你定義一組數(shù)據(jù)庫(kù)操作,然后告訴數(shù)據(jù)庫(kù)說(shuō)這些操作要么都成功,要么都不成功。類似于網(wǎng)購(gòu)買東西:你付完款,商家必須把東西寄到你的手上,期間無(wú)論是庫(kù)存、快遞、快遞員、商品質(zhì)量等任何一個(gè)環(huán)節(jié)出問(wèn)題,商家必須把錢退回給你。那么買東西,就是一個(gè)事務(wù)。事務(wù)的特性有四種--ACID:
先看看,如果兩個(gè)事務(wù)同時(shí)操作同一條數(shù)據(jù),會(huì)帶來(lái)哪些問(wèn)題:1.丟失更新:當(dāng)前余額為:1,A事務(wù)的功能是把余額+1;B事務(wù)的功能是把余額-1;它倆同時(shí)讀到了余額為0,悲劇就發(fā)生了。。。。2.臟讀:A事務(wù)正在把userName改成‘bizi’,還沒(méi)有提交,B事務(wù)來(lái)讀取userName,得到了‘bizi’,但是A事務(wù)在修改age時(shí)拋了異常,因此回滾,結(jié)果B事務(wù)就悲劇了。。。。3.幻讀:A事務(wù)讀了一下當(dāng)前的訂單數(shù)目,B事務(wù)過(guò)來(lái)新增加了一個(gè)訂單,A事務(wù)又讀了一次訂單數(shù),讀了兩次竟然結(jié)果不一樣,鬧鬼了。。。?4.不可重復(fù)讀:A事務(wù)讀取了某條數(shù)據(jù),B事務(wù)過(guò)來(lái)修改了這條數(shù)據(jù)并提交,A事務(wù)再讀的時(shí)候,就發(fā)現(xiàn)跟剛剛不一樣哎。。。不可重復(fù)讀跟臟讀的區(qū)別:? ? 臟讀讀取的是未提交的數(shù)據(jù),很有可能是無(wú)效的數(shù)據(jù)。而不可重復(fù)讀讀取的是提交之后的數(shù)據(jù),最起碼第二次讀對(duì)了
不可重復(fù)讀跟幻讀的區(qū)別:? ? 幻讀讀的是一整條記錄,而不可重復(fù)讀針對(duì)的是某一個(gè)或幾個(gè)特定字段。
那么為了避免這種情況,數(shù)據(jù)庫(kù)就設(shè)定了幾種隔離級(jí)別,供我們使用:1.串行化(Serializable):不允許事務(wù)并發(fā),大家排好隊(duì),上一個(gè)事務(wù)提交(或回滾)了,下一個(gè)事務(wù)再執(zhí)行。2.可重復(fù)讀(Repeatable-Read):同一事務(wù)前后兩次的讀,保證數(shù)據(jù)一致。意思就是:讀的時(shí)候,不允許別人寫。但是允許別人插入別的數(shù)據(jù),因此不能避免幻讀。3.讀已提交(Read Commited):只允許事務(wù)讀取被其他事務(wù)提交的數(shù)據(jù)。意思就是:如果當(dāng)前事務(wù)是修改數(shù)據(jù),那么不允許讀。因此避免臟讀,但是不能避免幻讀和不可重復(fù)讀。4.讀未提交(Read Uncommitted):允許事務(wù)讀取其他事務(wù)還未提交的數(shù)據(jù)。因此上述問(wèn)題都會(huì)發(fā)生。一個(gè)表格可以說(shuō)明一切(來(lái)源于@jiajialin:http://blog.csdn.net/jialinqiang/article/details/8723044):
來(lái)自為知筆記(Wiz)
- 原子性(Atomic):這個(gè)強(qiáng)調(diào)事務(wù)的根本特性,一個(gè)事務(wù)內(nèi)的所有操作必須像原子操作一樣,要么都成功要么都失敗,不能再拆分了。
- 一致性(Consistent):這個(gè)強(qiáng)調(diào)數(shù)據(jù)的完整性。就是說(shuō)事務(wù)修改前后,數(shù)據(jù)符合邏輯上的完整性。就像包裹從倉(cāng)庫(kù)寄到你家,手機(jī)不能變成磚頭。
- 隔離性(Insulation):這個(gè)強(qiáng)調(diào)的是兩個(gè)并發(fā)的事務(wù)應(yīng)該是互不干擾的。雖然兩個(gè)包裹都是從北京寄到上海,但是A包裹被退回時(shí),買家和賣家都沒(méi)必要去管B包裹是啥情況。
- 持久性(Duration):這個(gè)強(qiáng)調(diào)事務(wù)完成后對(duì)數(shù)據(jù)庫(kù)的影響是永久的,進(jìn)入一個(gè)穩(wěn)定的狀態(tài)。這個(gè)是相對(duì)于事務(wù)的實(shí)現(xiàn)來(lái)說(shuō)的,數(shù)據(jù)庫(kù)為了維持一個(gè)事務(wù),需要做很多緩存或者臨時(shí)性的操作。持久性就是在事務(wù)結(jié)束后,這些臨時(shí)操作都正式生效了。比如你手機(jī)確認(rèn)收貨后,買手機(jī)的過(guò)程就正式完成了。對(duì)于賣家來(lái)說(shuō),再有別的問(wèn)題,那就是售后的問(wèn)題,而不是銷售的問(wèn)題了。
先看看,如果兩個(gè)事務(wù)同時(shí)操作同一條數(shù)據(jù),會(huì)帶來(lái)哪些問(wèn)題:1.丟失更新:當(dāng)前余額為:1,A事務(wù)的功能是把余額+1;B事務(wù)的功能是把余額-1;它倆同時(shí)讀到了余額為0,悲劇就發(fā)生了。。。。2.臟讀:A事務(wù)正在把userName改成‘bizi’,還沒(méi)有提交,B事務(wù)來(lái)讀取userName,得到了‘bizi’,但是A事務(wù)在修改age時(shí)拋了異常,因此回滾,結(jié)果B事務(wù)就悲劇了。。。。3.幻讀:A事務(wù)讀了一下當(dāng)前的訂單數(shù)目,B事務(wù)過(guò)來(lái)新增加了一個(gè)訂單,A事務(wù)又讀了一次訂單數(shù),讀了兩次竟然結(jié)果不一樣,鬧鬼了。。。?4.不可重復(fù)讀:A事務(wù)讀取了某條數(shù)據(jù),B事務(wù)過(guò)來(lái)修改了這條數(shù)據(jù)并提交,A事務(wù)再讀的時(shí)候,就發(fā)現(xiàn)跟剛剛不一樣哎。。。不可重復(fù)讀跟臟讀的區(qū)別:? ? 臟讀讀取的是未提交的數(shù)據(jù),很有可能是無(wú)效的數(shù)據(jù)。而不可重復(fù)讀讀取的是提交之后的數(shù)據(jù),最起碼第二次讀對(duì)了
不可重復(fù)讀跟幻讀的區(qū)別:? ? 幻讀讀的是一整條記錄,而不可重復(fù)讀針對(duì)的是某一個(gè)或幾個(gè)特定字段。
那么為了避免這種情況,數(shù)據(jù)庫(kù)就設(shè)定了幾種隔離級(jí)別,供我們使用:1.串行化(Serializable):不允許事務(wù)并發(fā),大家排好隊(duì),上一個(gè)事務(wù)提交(或回滾)了,下一個(gè)事務(wù)再執(zhí)行。2.可重復(fù)讀(Repeatable-Read):同一事務(wù)前后兩次的讀,保證數(shù)據(jù)一致。意思就是:讀的時(shí)候,不允許別人寫。但是允許別人插入別的數(shù)據(jù),因此不能避免幻讀。3.讀已提交(Read Commited):只允許事務(wù)讀取被其他事務(wù)提交的數(shù)據(jù)。意思就是:如果當(dāng)前事務(wù)是修改數(shù)據(jù),那么不允許讀。因此避免臟讀,但是不能避免幻讀和不可重復(fù)讀。4.讀未提交(Read Uncommitted):允許事務(wù)讀取其他事務(wù)還未提交的數(shù)據(jù)。因此上述問(wèn)題都會(huì)發(fā)生。一個(gè)表格可以說(shuō)明一切(來(lái)源于@jiajialin:http://blog.csdn.net/jialinqiang/article/details/8723044):
來(lái)自為知筆記(Wiz)
轉(zhuǎn)載于:https://www.cnblogs.com/bishion/p/4936523.html
總結(jié)
以上是生活随笔為你收集整理的数据库事务的隔离机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mean项目的分模块开发
- 下一篇: solr7.4.0+mysql+solr