數(shù)據(jù)庫事務(wù)與spring_第1頁
數(shù)據(jù)庫事務(wù)與spring_第2頁
數(shù)據(jù)庫事務(wù)與spring_第3頁
數(shù)據(jù)庫事務(wù)與spring_第4頁
數(shù)據(jù)庫事務(wù)與spring_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——數(shù)據(jù)庫事務(wù)與spring

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

事務(wù)的ACID特性

1.原子性(Atomicity)

表示組成事務(wù)的多個數(shù)據(jù)庫操作是一個不可分割的工作單元,只有所有的操作都執(zhí)行成功,整個事務(wù)才提交,事務(wù)中任何一個數(shù)據(jù)庫操作(SQL語句)失敗,已經(jīng)成功執(zhí)行的任何操作都必需撤銷,讓數(shù)據(jù)庫返回到事務(wù)執(zhí)行前的狀態(tài)。

2.一致性(Consistency)

數(shù)據(jù)庫事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性以及業(yè)務(wù)規(guī)律上的一致性。事務(wù)操作成功后,數(shù)據(jù)庫所處的狀態(tài)和它的業(yè)務(wù)規(guī)則是一致的,即數(shù)據(jù)一致性不會被破壞。例如從A賬戶轉(zhuǎn)賬100元到B賬戶,不管操作成功與否,A和B的存款總額是不變的。

也就是說數(shù)據(jù)庫要一直處于一致的狀態(tài),事務(wù)開始前是一個一致狀態(tài),事務(wù)終止后是另一個一致狀態(tài),事務(wù)將數(shù)據(jù)庫從一個一致狀態(tài)轉(zhuǎn)移到另一個一致狀態(tài)

3.獨(dú)立性(Isolation)

所謂的獨(dú)立性就是指并發(fā)的事務(wù)之間不會相互影響,假使一個事務(wù)要訪問的數(shù)據(jù)正在被另外一個事務(wù)修改,只要另外一個事務(wù)還未提交,它所訪問的數(shù)據(jù)就不受未提交事務(wù)的影響。換句話說,一個事務(wù)

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

的影響在該事務(wù)提交前對其它事務(wù)是不可見的。一個事務(wù)都感覺不到系統(tǒng)中有其他事務(wù)在并發(fā)執(zhí)行。

4.持久性(Durability)

一旦事務(wù)提交成功后,事務(wù)中所有的數(shù)據(jù)操作都必需被持久化到數(shù)據(jù)庫中。即使提交事務(wù)后,數(shù)據(jù)庫系統(tǒng)崩潰,也必需保證能夠通過某種機(jī)制恢復(fù)事務(wù)已經(jīng)提交的數(shù)據(jù)。

事務(wù)并發(fā)引起的問題

下面例子來自孫衛(wèi)琴的《精通Hibernate》:

在并發(fā)的環(huán)境之中,一個數(shù)據(jù)庫系統(tǒng)會同時為各種各樣的客戶端提供服務(wù),對于同時運(yùn)行的多個事務(wù),當(dāng)這些事務(wù)訪問數(shù)據(jù)庫中一致的數(shù)據(jù)時假使沒有采取必要的隔離機(jī)制,就會出現(xiàn)各種并發(fā)問題,可以把這些問題歸納為一下五種:

假設(shè)現(xiàn)在一所銀行有一個取款事務(wù)和一個支票轉(zhuǎn)賬事務(wù)操作同一個銀行賬戶的情形,首先我們假設(shè)兩個事務(wù)順序執(zhí)行,而不是并發(fā)執(zhí)行,那么整個的步驟如下:

銀行客戶在銀行前臺請求取款100元,出納員先查詢賬戶信息,得知存款余額為1000元。

出納員判斷存款余額大于取款額,支付給客戶100元,并將賬戶上的存款余額改為900元。

出納員處理一張轉(zhuǎn)賬支票,該支票向此賬戶匯入100元,出納員

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

先查詢賬戶信息,得知存款余額為900元。出納員將存款余額改為1000元。

可以很明白的看到,假使順序的執(zhí)行這兩個事務(wù),不會出現(xiàn)任何問題,可是現(xiàn)實(shí)之中并非如此簡單,假使兩個事務(wù)分別由兩個出納員同時執(zhí)行那麼可能就會出現(xiàn)并發(fā)的問題,下面我們分別來介紹:

1.第一類丟失更新

這樣的話,用戶損失了100元,數(shù)據(jù)庫中的數(shù)據(jù)出現(xiàn)了不一致。A事務(wù)撤銷的時候,把已經(jīng)提交的B事務(wù)所做的數(shù)據(jù)更新覆蓋了。

2.其次類丟失更新

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

這樣的話,銀行就損失了100元。

B事務(wù)提交的時候,覆蓋了A事務(wù)已經(jīng)提交的數(shù)據(jù),導(dǎo)致A事務(wù)所做的操作丟失。

3.臟讀

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

事務(wù)B讀取了事務(wù)A已經(jīng)修改但是還沒有提交的數(shù)據(jù),并且基于了臟數(shù)據(jù)進(jìn)行操作。假使A事務(wù)回滾,那么B事務(wù)讀取的數(shù)據(jù)其實(shí)是不合法的。

4.不可重復(fù)讀

查詢卻返回了不同數(shù)據(jù)。這是由于查詢時系統(tǒng)中其他事務(wù)修改的提交而引起的。譬如事務(wù)T1讀取某一數(shù)據(jù),事務(wù)T2讀取并修改了該數(shù)據(jù),T1為了對讀取值進(jìn)行檢驗(yàn)而再次讀取該數(shù)據(jù),便得到了不同的結(jié)果。

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

一種更易理解的說法是:在一個事務(wù)內(nèi),屢屢讀同一個數(shù)據(jù)。在這個事務(wù)還沒有終止時,另一個事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個事務(wù)的兩次讀數(shù)據(jù)之間。由于其次個事務(wù)的修改,那么第一個事務(wù)讀到的數(shù)據(jù)可能不一樣,這樣就發(fā)生了在一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為不可重復(fù)讀,即原始讀取不可重復(fù)。

5.幻讀/虛讀

不一致,這個時候事務(wù)B出現(xiàn)了幻象讀?;孟笞x一般發(fā)生在統(tǒng)計(jì)事務(wù)中,假使另一個事務(wù)新增/刪除的數(shù)據(jù)行,剛好滿足當(dāng)前統(tǒng)計(jì)事務(wù)的查詢條件,就會導(dǎo)致屢屢統(tǒng)計(jì)結(jié)果不一致的狀況。

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

事務(wù)隔離級別

盡管數(shù)據(jù)庫為用戶提供了鎖的DML操作方式,但直接使用鎖管理是十分麻煩的,因此數(shù)據(jù)庫為用戶提供了自動鎖機(jī)制。只要用戶指定會話的事務(wù)隔離級別,數(shù)據(jù)庫就會分析事務(wù)中的SQL語句,然后自動為事務(wù)操作的數(shù)據(jù)資源添加上適合的鎖。此外數(shù)據(jù)庫還會維護(hù)這些鎖,當(dāng)一個資源上的鎖數(shù)目太多時,自動進(jìn)行鎖升級以提高系統(tǒng)的運(yùn)行性能,而這一過程對用戶來說完全是透明的。

ANSI/ISOSQL92標(biāo)準(zhǔn)定義了4個等級的事務(wù)隔離級別,在一致數(shù)據(jù)環(huán)境下,使用一致的輸入,執(zhí)行一致的工作,根據(jù)不同的隔離級別,可以導(dǎo)致不同的結(jié)果。不同事務(wù)隔離級別能夠解決的數(shù)據(jù)并發(fā)問題的能力是不同的。JDBC規(guī)范中,Java.sql.Connection接口定義了5個與事務(wù)隔離級別相關(guān)的常量。不同數(shù)據(jù)庫支持的事務(wù)隔離級別可能不一致,標(biāo)準(zhǔn)的SQL規(guī)范定義了4種隔離級別。

TRANSACTION_NONE

不支持事務(wù),會產(chǎn)生事務(wù)并發(fā)的所有問題。實(shí)際應(yīng)用中,幾乎是不會使用這種數(shù)據(jù)庫的。這個級別只是Connection中定義的常量,沒有對應(yīng)SQL標(biāo)準(zhǔn)。

TRANSACTION_READ_UNCOMMITTED

公司發(fā)工資了,領(lǐng)導(dǎo)把5000元打到singo的賬號上,但是該事務(wù)并未提交,而singo正好去查看賬戶,發(fā)現(xiàn)工資已經(jīng)到賬,是5000

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

元整,十分高興??墒遣恍业氖?,領(lǐng)導(dǎo)發(fā)現(xiàn)發(fā)給singo的工資金額不對,是2000元,于是迅速回滾了事務(wù),修改金額后,將事務(wù)提交,最終singo實(shí)際的工資只有2000元,singo空歡喜一場。

出現(xiàn)上述狀況,即我們所說的臟讀。兩個并發(fā)的事務(wù),“事務(wù)A:領(lǐng)導(dǎo)給singo發(fā)工資〞、“事務(wù)B:singo查詢工資賬戶〞,事務(wù)B讀取了事務(wù)A尚未提交的數(shù)據(jù)。當(dāng)事務(wù)隔離級別設(shè)置為Readuncommitted時,就可能出現(xiàn)臟讀。

TRANSACTION_READ_COMMITTED

singo拿著工資卡去消費(fèi),系統(tǒng)讀取到卡里有2000元,而此時她的老婆也正好在網(wǎng)上轉(zhuǎn)賬,把singo工資卡的2000元轉(zhuǎn)到另一賬戶,并在singo之前提交了事務(wù)。當(dāng)singo扣款時,系統(tǒng)檢查到singo的工資卡已經(jīng)沒有錢,扣款失敗,singo十分納悶,明明卡里有錢,為何?出現(xiàn)上述狀況,即我們所說的不可重復(fù)讀,兩個并發(fā)的事務(wù),“事務(wù)A:singo消費(fèi)〞、“事務(wù)B:singo的老婆網(wǎng)上轉(zhuǎn)賬〞。事務(wù)A事先讀取了數(shù)據(jù),事務(wù)B緊接了更新了數(shù)據(jù),并提交了事務(wù),而事務(wù)A再次讀取該數(shù)據(jù)時,數(shù)據(jù)已經(jīng)發(fā)生了改變。

當(dāng)隔離級別設(shè)置為Readcommitted時,可以避免臟讀,而且具有較好的并發(fā)性能。大多數(shù)數(shù)據(jù)庫的默認(rèn)級別就是Readcommitted,如Oracle、Sqlserver。由于這個級別在數(shù)據(jù)庫可靠性和性能之間取得均衡,基本能夠滿足大部分的應(yīng)用。盡管它會導(dǎo)致不可重復(fù)讀、虛讀和其次類丟失更新,在可能出現(xiàn)這些問題的場合,可以由應(yīng)用程序采用

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

不同的事務(wù)隔離級別能夠解決的并發(fā)問題如下:

悲觀所和樂觀鎖

為了得到最大的性能,一般數(shù)據(jù)庫都有并發(fā)機(jī)制,不過帶來的問題就是數(shù)據(jù)訪問的沖突。為了解決這個問題,大多數(shù)數(shù)據(jù)庫用的方法就是數(shù)據(jù)的鎖定。Therearemechanismsemployedtomanagetheactionsofmultipleconcurrentusersonadatabase–thepurposeistopreventlostupdatesanddirtyreads.ThetwotypesoflockingarePessimisticandOptimisticLocking.引用wiki的定義:

悲觀鎖:

悲觀鎖,正如其名,它指的是對數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù),以及來自外部系統(tǒng)的事務(wù)處理)修改持保守態(tài)度。在才能務(wù)的整個數(shù)據(jù)處理過程中,選定的數(shù)據(jù)一直處于鎖定狀態(tài),直到該事務(wù)提交或回滾。

悲觀鎖是指假設(shè)并發(fā)更新沖突會發(fā)生,所以不管沖突是否真的

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

發(fā)生,都會使用鎖機(jī)制。悲觀鎖會完成以下功能:鎖住讀取的記錄,防止其它事務(wù)讀取和更新這些記錄。其它事務(wù)會一直阻塞,直到這個事務(wù)終止。悲觀鎖是在使用了數(shù)據(jù)庫的事務(wù)隔離功能的基礎(chǔ)上,獨(dú)享占用的資源,以此保證讀取數(shù)據(jù)一致性,避免修改丟失。

悲觀鎖的實(shí)現(xiàn),往往依靠數(shù)據(jù)庫提供的鎖機(jī)制(也只有數(shù)據(jù)庫層提供的鎖機(jī)制才能真正保證數(shù)據(jù)訪問的排他性,否則,即使在本系統(tǒng)中實(shí)現(xiàn)了加鎖機(jī)制,也無法保證外部系統(tǒng)不會修改數(shù)據(jù))。如Oracle數(shù)據(jù)的select*fromtable_namewhereid=100forudate;就是悲觀所。

樂觀鎖

樂觀鎖(OptimisticLocking)相對悲觀鎖而言,樂觀鎖機(jī)制采取了更加寬松的加鎖機(jī)制。悲觀鎖大多數(shù)狀況下依靠數(shù)據(jù)庫的鎖機(jī)制實(shí)現(xiàn),以保證操作最大程度的獨(dú)占性。但隨之而來的就是數(shù)據(jù)庫性能的大量開銷,特別是對長事務(wù)而言,這樣的開銷往往無法承受。而樂觀鎖機(jī)制在一定程度上解決了這個問題。

樂觀鎖,大多是基于數(shù)據(jù)版本(Version)記錄機(jī)制實(shí)現(xiàn)。何謂數(shù)據(jù)版本?即為數(shù)據(jù)增加一個版本標(biāo)識,在基于數(shù)據(jù)庫表的版本解決方案中,一般是通過為數(shù)據(jù)庫表增加一個“version〞字段來實(shí)現(xiàn)。讀取出數(shù)據(jù)時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫表對應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對,假使提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當(dāng)前版本號,則予以更新,否則認(rèn)為是過期數(shù)據(jù)。

全面的介紹了數(shù)據(jù)庫事務(wù)的概念,并發(fā)引起的問題,隔離級別和傳播行為,樂觀鎖和悲觀鎖

Spring事務(wù)傳播行為

Spring事務(wù)傳播行為說的就是當(dāng)一個方法調(diào)用另一個方法時,事務(wù)應(yīng)當(dāng)如何操作。使用方式,就是使用@Transactional注解對方法進(jìn)行標(biāo)注,設(shè)定相應(yīng)的屬性,如

@Transactional(propagation=Propagation.MANDATORY)publicvoidadd(Useruser){}

Propagation.MANDATORY

該方法必需運(yùn)行在一個事務(wù)中。假使當(dāng)前線程不存在事務(wù),則拋出異常。

org.springframework.transaction.IllegalTransactionStateException:

No

existingtransactionfoundfortransaction

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論