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