最近研究讀取數(shù)據(jù),稍微總結(jié)一下,以后繼續(xù)補(bǔ)充:
????
?事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂的事務(wù),它是一個(gè)操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個(gè)弗成分割的工作單位。例如,銀行轉(zhuǎn)賬工作:從一個(gè)賬號(hào)扣款并使另一個(gè)賬號(hào)增款,這兩個(gè)操作要么都執(zhí)行,要么都不執(zhí)行。所以,應(yīng)該把它們看成一個(gè)事務(wù)。事務(wù)是數(shù)據(jù)庫(kù)維護(hù)數(shù)據(jù)一致性的單位,在每個(gè)事務(wù)結(jié)束時(shí),都能堅(jiān)持?jǐn)?shù)據(jù)一致性。
????
????
???????針對(duì)下面的描述可以看出,事務(wù)的提出重要是為了處理并發(fā)情況下堅(jiān)持?jǐn)?shù)據(jù)一致性的問(wèn)題。
????
???????事務(wù)擁有以下4個(gè)基本特征。
????
●???Atomic(原子性):事務(wù)中包括的操作被看做一個(gè)邏輯單元,這個(gè)邏輯單元中的操作要么全體成功,要么全體失敗。
????
●???Consistency(一致性):只有合法的數(shù)據(jù)可以被寫(xiě)入數(shù)據(jù)庫(kù),否則事務(wù)應(yīng)該將其回滾到最初狀態(tài)。
????
●???Isolation(斷絕性):事務(wù)答應(yīng)多個(gè)用戶對(duì)同一個(gè)數(shù)據(jù)進(jìn)行并發(fā)拜訪,而不破壞數(shù)據(jù)的正確性和完整性。同時(shí),并行事務(wù)的修改必須與其他并行事務(wù)的修改相互獨(dú)立。
????
●???Durability(速?zèng)Q性):事務(wù)結(jié)束后,事務(wù)處置的結(jié)果必須能夠得到固化。
????
???????數(shù)據(jù)庫(kù)肯定是要被廣大客戶所同享拜訪的,那么在數(shù)據(jù)庫(kù)操作進(jìn)程中很可能出現(xiàn)以下幾種不確定情況。
????
●???更新喪失(Lost update):兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù),但是第二個(gè)事務(wù)卻半途失敗退出,導(dǎo)致對(duì)數(shù)據(jù)的兩個(gè)修改都失效了。這是因?yàn)橄到y(tǒng)沒(méi)有執(zhí)行任何的鎖操作,因此并發(fā)事務(wù)并沒(méi)有被斷絕開(kāi)來(lái)。
????
●???臟讀取(Dirty Reads):一個(gè)事務(wù)開(kāi)始讀取了某行數(shù)據(jù),但是另外一個(gè)事務(wù)已更新了此數(shù)據(jù)但沒(méi)有能夠及時(shí)提交。這是相稱(chēng)危險(xiǎn)的,因?yàn)楹芸赡芩械牟僮鞫急换貪L。
????
●???弗成重復(fù)讀取(Non-repeatable Reads):一個(gè)事務(wù)對(duì)同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果。例如,在兩次讀取的半途,有另外一個(gè)事務(wù)對(duì)該行數(shù)據(jù)進(jìn)行了修改,并提交。
????
●???兩次更新問(wèn)題(Second lost updates problem):沒(méi)法重復(fù)讀取的特例。有兩個(gè)并發(fā)事務(wù)同時(shí)讀取同一行數(shù)據(jù),然后其中一個(gè)對(duì)它進(jìn)行修改提交,而另一個(gè)也進(jìn)行了修改提交。這就會(huì)造成第一次寫(xiě)操作失效。
????每日一道理
“一年之計(jì)在于春”,十幾歲的年紀(jì),正是人生的春天,別辜負(fù)了歲月老人的厚愛(ài)與恩賜。行動(dòng)起來(lái),播種夢(mèng)想吧!
????
●???虛讀(Phantom Reads):事務(wù)在操作進(jìn)程中進(jìn)行兩次查詢(xún),第二次查詢(xún)的結(jié)果包括了第一次查詢(xún)中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢(xún)的SQL語(yǔ)句相同)。這是因?yàn)樵趦纱尾樵?xún)進(jìn)程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的。
????
?數(shù)據(jù)庫(kù)的斷絕級(jí)別
???????為了避免下面出現(xiàn)的幾種情況,在標(biāo)準(zhǔn)SQL標(biāo)準(zhǔn)中,定義了4個(gè)事務(wù)斷絕級(jí)別,不同的斷絕級(jí)別對(duì)事務(wù)的處置不同。
●???未授權(quán)讀取(Read Uncommitted):答應(yīng)臟讀取,但不答應(yīng)更新喪失。如果一個(gè)事務(wù)已開(kāi)始寫(xiě)數(shù)據(jù),則另外一個(gè)數(shù)據(jù)則不答應(yīng)同時(shí)進(jìn)行寫(xiě)操作,但答應(yīng)其他事務(wù)讀此行數(shù)據(jù)。該斷絕級(jí)別可以通過(guò)“排他寫(xiě)鎖”實(shí)現(xiàn)。
●???授權(quán)讀取(Read Committed):答應(yīng)弗成重復(fù)讀取,但不答應(yīng)臟讀取。這可以通過(guò)“霎時(shí)同享讀鎖”和“排他寫(xiě)鎖”實(shí)現(xiàn)。讀取數(shù)據(jù)的事務(wù)答應(yīng)其他事務(wù)繼續(xù)拜訪該行數(shù)據(jù),但是未提交的寫(xiě)事務(wù)將會(huì)禁止其他事務(wù)拜訪該行。
●???可重復(fù)讀取(Repeatable Read):禁止弗成重復(fù)讀取和臟讀取,但是偶然可能出現(xiàn)幻影數(shù)據(jù)。這可以通過(guò)“同享讀鎖”和“排他寫(xiě)鎖”實(shí)現(xiàn)。讀取數(shù)據(jù)的事務(wù)將會(huì)禁止寫(xiě)事務(wù)(但答應(yīng)讀事務(wù)),寫(xiě)事務(wù)則禁止任何其他事務(wù)。
●???序列化(Serializable):供給嚴(yán)厲的事務(wù)斷絕。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過(guò)“行級(jí)鎖”是沒(méi)法實(shí)現(xiàn)事務(wù)序列化的,必須通過(guò)其他機(jī)制保障新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢(xún)操作的事務(wù)拜訪到。
???????斷絕級(jí)別越高,越能保障數(shù)據(jù)的完整性和一致性,但是對(duì)并發(fā)性能的影響也越大。對(duì)于多數(shù)應(yīng)用程序,可以?xún)?yōu)先斟酌把數(shù)據(jù)庫(kù)系統(tǒng)的斷絕級(jí)別設(shè)為Read Committed,它能夠避免臟讀取,而且擁有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致弗成重復(fù)讀、虛讀和第二類(lèi)喪失更新這些并發(fā)問(wèn)題,在可能出現(xiàn)這類(lèi)問(wèn)題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采取悲觀鎖或悲觀鎖來(lái)控制。
???????通過(guò)前面的分析已知道,通過(guò)選用不同的斷絕品級(jí)就能夠在不同程度上避免前面所提及的在事務(wù)處置中所面對(duì)的各種問(wèn)題。所以,數(shù)據(jù)庫(kù)斷絕級(jí)別的選取就顯得尤為重要,在選取數(shù)據(jù)庫(kù)的斷絕級(jí)別時(shí),應(yīng)該注意以下幾個(gè)處置的原則:
???????首先,必須清除“未授權(quán)讀取”,因?yàn)樵诙鄠€(gè)事務(wù)之間使用它將會(huì)是非常危險(xiǎn)的。事務(wù)的回滾操作或失敗將會(huì)影響到其他并發(fā)事務(wù)。第一個(gè)事務(wù)的回滾將會(huì)完全將其他事務(wù)的操作清除,甚至使數(shù)據(jù)庫(kù)處在一個(gè)不一致的狀態(tài)。很可能一個(gè)已回滾為結(jié)束的事務(wù)對(duì)數(shù)據(jù)的修改最后卻修改提交了,因?yàn)椤拔词跈?quán)讀取”答應(yīng)其他事務(wù)讀取數(shù)據(jù),最后整個(gè)錯(cuò)誤狀態(tài)在其他事務(wù)之間傳播開(kāi)來(lái)。
???????其次,絕大部分應(yīng)用都無(wú)須使用“序列化”斷絕(一般來(lái)說(shuō),讀取幻影數(shù)據(jù)并非一個(gè)問(wèn)題),此斷絕級(jí)別也難以丈量。現(xiàn)在使用序列化斷絕的應(yīng)用中,一般都使用悲觀鎖,這樣強(qiáng)行使所有事務(wù)都序列化執(zhí)行。
???????剩下的也就是在“授權(quán)讀取”和“可重復(fù)讀取”之間選擇了。我們先斟酌可重復(fù)讀取。如果所有的數(shù)據(jù)拜訪都是在統(tǒng)一的原子數(shù)據(jù)庫(kù)事務(wù)中,此斷絕級(jí)別將清除一個(gè)事務(wù)在另外一個(gè)并發(fā)事務(wù)進(jìn)程中覆蓋數(shù)據(jù)的可能性(第二個(gè)事務(wù)更新喪失問(wèn)題)。這是一個(gè)非常重要的問(wèn)題,但是使用可重復(fù)讀取并非處理問(wèn)題的獨(dú)一途徑。
???????假設(shè)使用了“版本數(shù)據(jù)”,Hibernate會(huì)自動(dòng)使用版本數(shù)據(jù)。Hibernate的一級(jí)Session緩存和版本數(shù)據(jù)已為你供給了“可重復(fù)讀取斷絕”絕大部分的特性。特殊是,版本數(shù)據(jù)可以防止二次更新喪失的問(wèn)題,一級(jí)Session緩存可以保障速?zèng)Q載入數(shù)據(jù)的狀態(tài)與其他事務(wù)對(duì)數(shù)據(jù)的修改斷絕開(kāi)來(lái),因此如果使用對(duì)所有的數(shù)據(jù)庫(kù)事務(wù)采取授權(quán)讀取斷絕和版本數(shù)據(jù)是行得通的。
???????“可重復(fù)讀取”為數(shù)據(jù)庫(kù)查詢(xún)供給了更好的效率(僅對(duì)那些長(zhǎng)時(shí)間的數(shù)據(jù)庫(kù)事務(wù)),但是由于幻影讀取仍然存在,因此沒(méi)必要使用它(對(duì)于Web應(yīng)用來(lái)說(shuō),一般也很少在一個(gè)數(shù)據(jù)庫(kù)事務(wù)中對(duì)同一個(gè)表查詢(xún)兩次)。
???????也可以同時(shí)斟酌選擇使用Hibernate的二級(jí)緩存,它可以猶如底層的數(shù)據(jù)庫(kù)事務(wù)一樣供給相同的事務(wù)斷絕,但是它可能弱化斷絕。假如在二級(jí)緩存大批使用緩存并發(fā)策略,它并不供給重復(fù)讀取語(yǔ)義(例如,前面章節(jié)中將要探討的讀寫(xiě),特殊是非嚴(yán)厲讀寫(xiě)),很輕易可以選擇默認(rèn)的斷絕級(jí)別:因?yàn)闊o(wú)論如何都沒(méi)法實(shí)現(xiàn)“可重復(fù)讀取”,因此就更沒(méi)有必要拖慢數(shù)據(jù)庫(kù)了。另一方面,可能對(duì)癥結(jié)類(lèi)不采取二級(jí)緩存,或者采取一個(gè)完全的事務(wù)緩存,供給“可重復(fù)讀取斷絕”。那么在業(yè)務(wù)中須要使用到“可重復(fù)讀取”嗎?如果你愛(ài)好,當(dāng)然可以那樣做,但更多的時(shí)候并沒(méi)有必要花費(fèi)這個(gè)代價(jià)。
文章結(jié)束給大家分享下程序員的一些笑話語(yǔ)錄: 面試官:熟悉哪種語(yǔ)言
應(yīng)聘者:JAVA
面試官:知道什么叫類(lèi)么
應(yīng)聘者:我這人實(shí)在,工作努力,不知道什么叫累
面試官:知道什么是包?
應(yīng)聘者:我這人實(shí)在 平常不帶包 也不用公司準(zhǔn)備了
面試官:知道什么是接口嗎?
應(yīng)聘者:我這個(gè)人工作認(rèn)真。從來(lái)不找借口偷懶
面試官:知道什么是繼承么
應(yīng)聘者:我是孤兒沒(méi)什么可以繼承的
面試官:知道什么叫對(duì)象么?
應(yīng)聘者:知道,不過(guò)我工作努力,上進(jìn)心強(qiáng),暫時(shí)還沒(méi)有打算找對(duì)象。
面試官:知道多態(tài)么?
應(yīng)聘者:知道,我很保守的。我認(rèn)為讓心愛(ài)的女人為了自已一時(shí)的快樂(lè)去墮胎是不道德的行為!請(qǐng)問(wèn)這和C#有什么關(guān)系??
讀取數(shù)據(jù)事務(wù)