事務、并發、隔離級別、鎖3_第1頁
事務、并發、隔離級別、鎖3_第2頁
事務、并發、隔離級別、鎖3_第3頁
事務、并發、隔離級別、鎖3_第4頁
事務、并發、隔離級別、鎖3_第5頁
已閱讀5頁,還剩24頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數據庫

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

類別

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

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

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

查詢出結果隔離級別與鎖>隔離級別>可重復讀EX:可重復讀:意義:在多用戶環境下,用戶A開了一個事務,并且先對test表的某條記錄做了查詢(select*fromtestwherename=‘AA’),接著用戶B對test表做了更新并提交(updatetestsetage=25wherename=’AA’),這時A再去查test表中的這條記錄,第一次讀到的age值為12,第二次為25,兩次讀到的數據不一樣,稱之為非重復讀。演示:1)用戶A:SETTRANSACTIONISOLATIONLEVELREPEATABLEREADBEGINTRANSELECTMSG_FLGFROMCOUPON_ABNORWHERECONTENT_ID=4612)用戶B:UPDATECOUPON_ABNORSETMSG_FLG=1WHERECONTENT_ID=461(等待中)3)用戶A:COMMITTRANSACTION4)用戶BUPDATE成功隔離級別與鎖>隔離級別>可序列化EX:可序列化:意義:在多用戶環境下,用戶A開啟了一個事務,并查詢test表中的所有記錄,然后用戶B在自己的事務中插入(或刪除)了test表中的一條記錄并提交事務,此時用戶A再去執行前面的查詢整張表記錄的操作,結果會多出(少了)一條記錄,此操作稱之為幻象。(如圖演示)演示: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隔離級別與鎖>隔離級別>小結1.未提交讀:主動

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

溫馨提示

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

評論

0/150

提交評論