事務(wù)、并發(fā)、隔離級別、鎖3_第1頁
事務(wù)、并發(fā)、隔離級別、鎖3_第2頁
事務(wù)、并發(fā)、隔離級別、鎖3_第3頁
事務(wù)、并發(fā)、隔離級別、鎖3_第4頁
事務(wù)、并發(fā)、隔離級別、鎖3_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

數(shù)據(jù)庫

并發(fā)、事務(wù)、隔離級別、鎖新事業(yè)部:程學(xué)文目錄事務(wù)與并發(fā)隔離級別和鎖行版本控制(2005)死鎖與解鎖事務(wù)與并發(fā)隔離級別和鎖行版本控制(2005)死鎖與解鎖并發(fā)與事務(wù)>數(shù)據(jù)完整性數(shù)據(jù)完整性:數(shù)據(jù)完整性(DataIntegrity)是指數(shù)據(jù)的精確性、是指數(shù)據(jù)的精確性和可靠性。它是應(yīng)防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。數(shù)據(jù)完整性分為四類:a.實(shí)體完整性(EntityIntegrity)b.域完整性(DomainIntegrity)c.參照完整性(ReferentialIntegrity)d.用戶定義的完整性(User-definedIntegrity)并發(fā)與事務(wù)>數(shù)據(jù)完整性>實(shí)體完整性實(shí)體完整性:概念:實(shí)體完整性指表中行的完整性。要求表中的所有行都有唯一的標(biāo)識符,稱為主關(guān)鍵字。主關(guān)鍵字是否可以修改,或整個列是否可以被刪除,取決于主關(guān)鍵字與其他表之間要求的完整性。實(shí)體完整性要求每一個表中的主鍵字段都不能為空或者重復(fù)的值。并發(fā)與事務(wù)>數(shù)據(jù)完整性>域完整性域完整性:概念:域完整性是針對某一具體關(guān)系數(shù)據(jù)庫的約束條件。它反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語義要求。域完整性指列的值域的完整性。如數(shù)據(jù)類型、格式、值域范圍、是否允許空值等。域完整性限制了某些屬性中出現(xiàn)的值,把屬性限制在一個有限的集合中。例如,如果屬性類型是整數(shù),那么它就不能是101.5或任何非整數(shù)。并發(fā)與事務(wù)>數(shù)據(jù)完整性>參照完整性參照完整性:概念:當(dāng)更新、刪除、插入一個表中的數(shù)據(jù)時,通過參照引用相互關(guān)聯(lián)的另一個表中的數(shù)據(jù),來檢查對表的數(shù)據(jù)操作是否正確。簡單的說就是表間主鍵外鍵的關(guān)系,是相關(guān)聯(lián)的兩個表之間的約束。參照完整性屬于表間規(guī)則。對于永久關(guān)系的相關(guān)表,在更新、插入或刪除記錄時,如果只改其一不改其二,就會影響數(shù)據(jù)的完整性:例如修改父表中關(guān)鍵字值后,子表關(guān)鍵字值未做相應(yīng)改變;刪除父表的某記錄后,子表的相應(yīng)記錄未刪除,致使這些記錄成為孤立記錄;對于子表插入的記錄,父表中沒有相應(yīng)關(guān)鍵字值的記錄;等等。對于這些設(shè)計表間數(shù)據(jù)的完整性,統(tǒng)稱為參照完整性。并發(fā)與事務(wù)>事務(wù)事務(wù):數(shù)據(jù)庫提供了多種保證數(shù)據(jù)完整性的方式,其中一種基本方式便是事務(wù)EX:銀行轉(zhuǎn)賬:甲向乙賬戶轉(zhuǎn)帳100元1.檢查甲賬戶余額是否超過100元2.如果大于100元,則甲賬戶扣除100元3.乙賬戶增加100元概念:數(shù)據(jù)庫事務(wù)是指作為單個邏輯工作單元執(zhí)行的一系列操作,事務(wù)內(nèi)的語句被作為一個整體執(zhí)行,確保除非事務(wù)性單元內(nèi)的所有操作都成功完成,否則不會永久更新面向數(shù)據(jù)的資源。并發(fā)與事務(wù)>事務(wù)>事務(wù)的特點(diǎn)事務(wù)的特點(diǎn):一個邏輯工作單元要成為事務(wù),必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性:a.原子性:事務(wù)必須是原子工作單元;對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。通常,與某個事務(wù)關(guān)聯(lián)的操作具有共同的目標(biāo),并且是相互依賴的。如果系統(tǒng)只執(zhí)行這些操作的一個子集,則可能會破壞事務(wù)的總體目標(biāo)。原子性消除了系統(tǒng)操作子集的可能性。b.一致性:事務(wù)的一致性指的是在一個事務(wù)執(zhí)行之前和執(zhí)行。之后數(shù)據(jù)庫都必須處于一致性狀態(tài)。這種特性稱為事務(wù)的一致性假如數(shù)據(jù)庫的狀態(tài)滿足所有的完整性約束,就說該數(shù)據(jù)庫是一致的。并發(fā)與事務(wù)>事務(wù)>事務(wù)的特點(diǎn)例如,當(dāng)數(shù)據(jù)庫處于一致性狀態(tài)S1時,對數(shù)據(jù)庫執(zhí)行一個事務(wù),在事務(wù)執(zhí)行期間假定數(shù)據(jù)庫的狀態(tài)是不一致的,當(dāng)事務(wù)執(zhí)行結(jié)束時,數(shù)據(jù)庫處在一致性狀態(tài)S2。c.隔離性:由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。事務(wù)查看數(shù)據(jù)時數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會查看中間狀態(tài)的數(shù)據(jù)。當(dāng)事務(wù)可序列化時將獲得最高的隔離級別。在此級別上,從一組可并行執(zhí)行的事務(wù)獲得的結(jié)果與通過連續(xù)運(yùn)行每個事務(wù)所獲得的結(jié)果相同。由于高度隔離會限制可并行執(zhí)行的事務(wù)數(shù),所以一些應(yīng)用程序降低隔離級別以換取更大的吞吐量。并發(fā)與事務(wù)>事務(wù)>事務(wù)的特點(diǎn)DBMS可以在并發(fā)執(zhí)行的事務(wù)間提供不同級別的分離。分離的級別和并發(fā)事務(wù)的吞吐量之間存在反比關(guān)系。較多事務(wù)的可分離性可能會帶來較高的沖突和較多的事務(wù)流產(chǎn)。流產(chǎn)的事務(wù)要消耗資源,這些資源必須要重新被訪問。因此,確保高分離級別的DBMS需要更多的開銷。d.持久性:持久性意味著當(dāng)系統(tǒng)或介質(zhì)發(fā)生故障時,確保已提交事務(wù)的更新不能丟失。即一旦一個事務(wù)提交,DBMS保證它對數(shù)據(jù)庫中數(shù)據(jù)的改變應(yīng)該是永久性的,耐得住任何系統(tǒng)故障。持久性通過數(shù)據(jù)庫備份和恢復(fù)來保證。并發(fā)與事務(wù)>并發(fā)并發(fā):通常為了獲得更好的運(yùn)行性能,各種數(shù)據(jù)庫都允許多個事務(wù)同時運(yùn)行,這就是事務(wù)并發(fā)。當(dāng)并發(fā)的事務(wù)訪問或修改數(shù)據(jù)庫中相同的數(shù)據(jù)時,通常需要采取必要的隔離機(jī)制,反之會出現(xiàn)各種并發(fā)問題。這些并發(fā)問題可歸納為以下四種:a.丟失或覆蓋更新。b.未確認(rèn)的相關(guān)性。(臟讀)c.不一致的分析。(不可重復(fù)讀)d.幻像讀并發(fā)與事務(wù)>并發(fā)>丟失更新丟失更新:當(dāng)兩個或多個事務(wù)選擇同一行,然后基于最初選定的值更新該行時,會發(fā)生丟失更新問題。每個事務(wù)都不知道其它事務(wù)的存在。最后的更新將重寫由其它事務(wù)所做的更新,這將導(dǎo)致數(shù)據(jù)丟失。例如:兩個編輯人員制作了同一文檔的電子復(fù)本。每個編輯人員獨(dú)立地更改其復(fù)本,然后保存更改后的復(fù)本,這樣就覆蓋了原始文檔。最后保存其更改復(fù)本的編輯人員覆蓋了第一個編輯人員所做的更改。如果在第一個編輯人員完成之后第二個編輯人員才能進(jìn)行更改,則可以避免該問題。并發(fā)與事務(wù)>并發(fā)>未確認(rèn)的相關(guān)性未確認(rèn)的相關(guān)性(臟讀):當(dāng)?shù)诙€事務(wù)選擇其它事務(wù)正在更新的行時,會發(fā)生未確認(rèn)的相關(guān)性問題。第二個事務(wù)正在讀取的數(shù)據(jù)還沒有確認(rèn)并且可能由更新此行的事務(wù)所更改。例如:一個編輯人員正在更改電子文檔。在更改過程中,另一個編輯人員復(fù)制了該文檔(該復(fù)本包含到目前為止所做的全部更改)并將其分發(fā)給預(yù)期的用戶。此后,第一個編輯人員認(rèn)為目前所做的更改是錯誤的,于是刪除了所做的編輯并保存了文檔。分發(fā)給用戶的文檔包含不再存在的編輯內(nèi)容,并且這些編輯內(nèi)容應(yīng)認(rèn)為從未存在過。如果在第一個編輯人員確定最終更改前任何人都不能讀取更改的文檔,則可以避免該問題。并發(fā)與事務(wù)>并發(fā)>不一致的分析不一致的分析(非重復(fù)讀):當(dāng)?shù)诙€事務(wù)多次訪問同一行而且每次讀取不同的數(shù)據(jù)時,會發(fā)生不一致的分析問題。不一致的分析與未確認(rèn)的相關(guān)性類似,因?yàn)槠渌聞?wù)也是正在更改第二個事務(wù)正在讀取的數(shù)據(jù)。然而,在不一致的分析中,第二個事務(wù)讀取的數(shù)據(jù)是由已進(jìn)行了更改的事務(wù)提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次信息都由其它事務(wù)更改;因而該行被非重復(fù)讀取。例如:一個編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當(dāng)編輯人員第二次讀取文檔時,文檔已更改。原始讀取不可重復(fù)。如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題。并發(fā)與事務(wù)>并發(fā)>幻想讀幻像讀:當(dāng)對某行執(zhí)行插入或刪除操作,而該行屬于某個事務(wù)正讀取的行的范圍時,會發(fā)生幻像讀問題。事務(wù)第一次讀的行范圍顯示出其中一行已不復(fù)存在于第二次讀或后續(xù)讀中,因?yàn)樵撔幸驯黄渌聞?wù)刪除。同樣,由于其它事務(wù)的插入操作,事務(wù)的第二次或后續(xù)讀顯示有一行已不存在于原始讀中。例如:一個編輯人員更改作者提交的文檔,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時,發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產(chǎn)部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。并發(fā)與事務(wù)隔離級別和鎖行版本控制(2005)死鎖與解鎖隔離級別與鎖>隔離級別1.隔離級別:控制隔離數(shù)據(jù)以供一個進(jìn)程使用并防止其它進(jìn)程干擾的程度的事務(wù)屬性。為在并發(fā)性能與并發(fā)問題間尋找一個最佳的平衡,隔離屬性分為不同級別,數(shù)據(jù)庫通過不同的隔離級別控制并發(fā)引起的問題:

類別

隔離級別1)未提交讀READUNCOMMITTED低2)已提交讀READCOMMITTED3)可重復(fù)讀REPEATABLEREAD4)可序列化SERIALIZABLE高隔離級別與鎖>隔離級別不同隔離級別對應(yīng)的并發(fā)問題處理:隔離級別臟讀不可重復(fù)讀幻想讀說明1.未提交讀可可可包含未提交數(shù)據(jù)的讀2.已提交讀*否可可讀取提交過的數(shù)據(jù),否則等待3.可重復(fù)讀否否可查詢期間,不允許其他事務(wù)對本結(jié)果集update4.可序列化否否否查詢期間,不允許其他事務(wù)對本結(jié)果集insert或delete隔離級別與鎖>隔離級別>未提交讀EX:未提交讀:(臟讀、不可重復(fù)讀、幻想讀)意義:包含未提交數(shù)據(jù)的讀。例如,在多用戶環(huán)境下,用戶B更改了某行。用戶A在用戶B提交更改之前讀取已更改的行。如果此時用戶B再回滾更改,則用戶A便讀取了邏輯上從未存在過的行。(如圖演示)演示:1)用戶B:BEGINTRANUPDATECOUPON_ABNORSETMSG_FLG=1WHERECONTENT_ID=4612)用戶A:SETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED(此句不寫即默認(rèn)為READCOMMITTED模式)SELECTMSG_FLGFROMCOUPON_ABNORWHERECONTENT_ID=461(此時將查到值為1)3)用戶B:ROLLBACK(此時撤消了步驟1的UPDATE操作,則用戶A讀到的錯誤數(shù)據(jù)被稱為臟讀)隔離級別與鎖>隔離級別>可提交讀EX:提交讀:(臟讀、不可重復(fù)讀●、幻想讀●)[“●”可以]意義:指定在讀取數(shù)據(jù)時(控制共享鎖)以避免臟讀。此隔離等級的主要作用是避免臟讀。演示:1.不可臟讀1)用戶B:BEGINTRANUPDATECOUPON_ABNORSETMSG_FLG=1WHERECONTENT_ID=4612)用戶A:SETTRANSACTIONISOLATIONLEVELREADCOMMITTEDSELECTMSG_FLGFROMCOUPON_ABNORWHERECONTENT_ID=461(上句設(shè)置了提交讀模式,則此

時將會查不到數(shù)據(jù),顯示查詢等待中,直到用戶B進(jìn)行了ROLLBACK或者COMMIT操作后,此語句才

會生效)3)用戶B:COMMIT4)用戶A:

查詢出結(jié)果隔離級別與鎖>隔離級別>可重復(fù)讀EX:可重復(fù)讀:意義:在多用戶環(huán)境下,用戶A開了一個事務(wù),并且先對test表的某條記錄做了查詢(select*fromtestwherename=‘AA’),接著用戶B對test表做了更新并提交(updatetestsetage=25wherename=’AA’),這時A再去查test表中的這條記錄,第一次讀到的age值為12,第二次為25,兩次讀到的數(shù)據(jù)不一樣,稱之為非重復(fù)讀。演示:1)用戶A:SETTRANSACTIONISOLATIONLEVELREPEATABLEREADBEGINTRANSELECTMSG_FLGFROMCOUPON_ABNORWHERECONTENT_ID=4612)用戶B:UPDATECOUPON_ABNORSETMSG_FLG=1WHERECONTENT_ID=461(等待中)3)用戶A:COMMITTRANSACTION4)用戶BUPDATE成功隔離級別與鎖>隔離級別>可序列化EX:可序列化:意義:在多用戶環(huán)境下,用戶A開啟了一個事務(wù),并查詢test表中的所有記錄,然后用戶B在自己的事務(wù)中插入(或刪除)了test表中的一條記錄并提交事務(wù),此時用戶A再去執(zhí)行前面的查詢整張表記錄的操作,結(jié)果會多出(少了)一條記錄,此操作稱之為幻象。(如圖演示)演示:1)用戶A:SETTRANSACTIONISOLATIONLEVELSERIALIZABLEBEGINTRANSELECTMSG_FLGFROMCOUPON_ABNORWHEREABNORCOUPON_ID='0000000000000000000'2)用戶B:INSERTINTOCOUPON_ABNOR(ABNORCOUPON_ID,RGST_ID,TIME_ORIGIN,ABNOR_CODE,STORE_ID,MSG_FLG)VALUES(‘0000000000000000000’,‘11’,getdate(),1,‘CS11’,0)--(等待中)3)用戶A:COMMITTRANSACTION隔離級別與鎖>隔離級別>小結(jié)1.未提交讀:主動

增強(qiáng)自身讀能力2.提交讀:主動降低自身讀能力3.可重復(fù)讀:主動+被動降低自身讀能力+增強(qiáng)事務(wù)自身保護(hù)力4.可序列化:主動+被動降低自身讀能力+增強(qiáng)事務(wù)自身保護(hù)力隔離級別與鎖>鎖做出了以上分析,現(xiàn)在我們可能會存在這樣的疑問,到底在執(zhí)行SQL語句的時候發(fā)出什么樣的鎖呢?這就由事務(wù)的隔離級別決定了。一

溫馨提示

  • 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

提交評論