版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度年福建省高校教師資格證之高等教育心理學(xué)題庫檢測試卷A卷附答案
- 2024年度山西省高校教師資格證之高等教育法規(guī)能力提升試卷A卷附答案
- 2024年度年福建省高校教師資格證之高等教育學(xué)練習(xí)題及答案
- 全國職業(yè)院校技能大賽中職組(母嬰照護(hù)賽項(xiàng))考試題及答案
- 四年級數(shù)學(xué)(小數(shù)加減運(yùn)算)計(jì)算題專項(xiàng)練習(xí)與答案
- 建筑會議紀(jì)要
- 內(nèi)蒙古英語高二上學(xué)期期末試卷及解答參考(2024年)
- 高溫?zé)峁軗Q熱器的穩(wěn)定性設(shè)計(jì)和結(jié)構(gòu)參數(shù)優(yōu)化
- 2024房產(chǎn)領(lǐng)域聯(lián)合投資建設(shè)協(xié)議
- 吊車租賃業(yè)務(wù)協(xié)議2024詳細(xì)條款
- 人教部編版七年級歷史上冊第19課 北魏政治和北方民族大交融課件(23張PPT)
- 小學(xué)科學(xué)教育科學(xué)三年級上冊天氣《認(rèn)識氣溫計(jì)》教學(xué)設(shè)計(jì)
- 液化氣站氣質(zhì)分析報(bào)告管理制度
- 砍伐工程方案35963
- 《大醫(yī)精誠》說課(新)
- 牛羊屠宰管理辦法
- 《微觀經(jīng)濟(jì)學(xué)》課程思政教學(xué)案例(一等獎)
- DBJ50T-232-2016 建設(shè)工程監(jiān)理工作規(guī)程
- 國際人力資源管理課程教學(xué)大綱
- 深信服園區(qū)級雙活數(shù)據(jù)中心
- T-CSCS 016-2021 鋼結(jié)構(gòu)制造技術(shù)標(biāo)準(zhǔn)
評論
0/150
提交評論