三峽大學韓芳oracle 11 事務和鎖教材_第1頁
三峽大學韓芳oracle 11 事務和鎖教材_第2頁
三峽大學韓芳oracle 11 事務和鎖教材_第3頁
三峽大學韓芳oracle 11 事務和鎖教材_第4頁
三峽大學韓芳oracle 11 事務和鎖教材_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、事務和鎖Oracle數(shù)據(jù)庫與應用事務和鎖制作人:韓芳電 話 箱:三峽大學計算機與信息學院數(shù)據(jù)一致性數(shù)據(jù)一致性 對于一個數(shù)據(jù)庫來說,其中的數(shù)據(jù)可能是每時每刻都在發(fā)生著變化,而在數(shù)據(jù)變化的同時,也無時無刻不伴隨著數(shù)據(jù)的讀取。這就對數(shù)據(jù)庫的狀態(tài)產(chǎn)生了比較高的要求數(shù)據(jù)庫的每次改變都是可被接受的,而每次讀取的數(shù)據(jù)也都是正常的。這就是數(shù)據(jù)一致性的體現(xiàn)。1.什么是事務 在數(shù)據(jù)庫中,提出了事務的概念來保證數(shù)據(jù)庫中數(shù)據(jù)的一致性。 事務是一組包含了一條或者多條語句的邏輯單元,事務中的語句被視為一個整體,要么一起被提交,是數(shù)據(jù)庫數(shù)據(jù)永久的修改;要么一起被撤銷,被數(shù)據(jù)庫不做任何的修改 經(jīng)典的

2、例子:銀行轉賬1.什么是事務 事務往往包括一個或多個處理步驟。例如,在超市購物包括 選購商品、放入購物車、付款、個人現(xiàn)金或銀行賬戶余額減少、超市賬戶余額增加、商品庫中商品信息更新等步驟。這些步驟組成了一個事務,當其中任何步驟出現(xiàn)異常,并且不能正常進行下去,都會影響其他所有步驟。 例如,付款階段不能正常進行,那么將不會對個人的現(xiàn)金或銀行賬戶造成影響,超市的賬戶也不可能進行余額的增加,商品庫中也不能更新該商品的信息。 同樣的,如果個人現(xiàn)金或賬戶余額不足,那么也無法完成整個交易。在此之前所做的所有動作:選購商品、放入購物車等都將無效,商品應當被重新放回貨架。1.什么是事務 一個事務的生命周期應當包括

3、: 事務開始(Oracle中并不能顯式開始一個事務,也不存在這樣的語句) 事務執(zhí)行 事務結束(commit或者rollback命令) Oracle基本控制語句 set transaction commit savepoint rollback rollback to savepoint2 事務的類型 (1)顯式事務01 新事務開始02 sql statement03 .04 commit | rollback (2) 隱式事務 沒有明確的開始和結束標志,由數(shù)據(jù)庫自動開始,當一個程序正常結束或者使用DDL語言自動提交,而當操作失敗時也會自動回滾。如果設置antocommit為打開狀態(tài)(默認關閉)

4、,則每次執(zhí)行DML操作都會自動提交。 語法:set autocommit on/offcommitcommit命令命令 事務在什么情況下結束需要注意: 否則有丟失數(shù)據(jù)的可能,當有下列情況之一的時候事務會結束: 使用commit事務提交,rollback事務回滾 執(zhí)行語句,事務自動提交,例如:createdropgrantrevoke等命令 正常退出SQLplus 時自動提交事務,非正常 退出則rollback事務回滾commitcommit命令命令 commit命令用于提交事務,并將事務中對數(shù)據(jù)庫的修改進行持久化,即將數(shù)據(jù)庫修改為另外一種狀態(tài),而這種狀態(tài)是可接受的、可靠的狀態(tài)。 while i

5、1000 loop update people set salary = salary + 10*i where id = i; i := i+1;end loop;commit; 對于開發(fā)者來說,最安全的方式是顯式進行數(shù)據(jù)的提交或者回滾,以結束事務。但很多時候,許多開發(fā)者并未注意該問題,而是依靠開發(fā)工具來進行提交或回滾。 此時需要注意的是,如果用戶未提交對數(shù)據(jù)庫的修改,而關閉了會話,或者數(shù)據(jù)庫連接在提交之前斷開,那么針對該數(shù)據(jù)庫的所有操作都將執(zhí)行回滾操作。commitcommit命令命令 另外,需要明確的概念是,在提交之前,數(shù)據(jù)庫已經(jīng)進行了實際更新,不過,并未得到數(shù)據(jù)庫認可,因此提交動作只是

6、一個獲得認可的過程,其花費的數(shù)據(jù)庫資源非常少。而且,提交一條數(shù)據(jù)與提交1000條數(shù)據(jù)所花費的數(shù)據(jù)庫資源是相同的。因此,當實現(xiàn)大數(shù)據(jù)量的數(shù)據(jù)修改或者插入操作時,應當采取最后一次性提交的策略。 while i1000 loop update people set salary = salary + 10*i where id = i; i := i+1; commit; end loop; 在該代碼片段中,每次更新數(shù)據(jù),都有一次提交動作,將造成數(shù)據(jù)庫資源的浪費。 roll backroll back命令命令 roll back命令用于回滾用戶操作。在某些時機,例如程序代碼段中出現(xiàn)異常或錯誤,或者用

7、戶直接發(fā)出撤銷命令,需要回滾操作?;貪L操作將終止事務處理,并撤銷用戶在當前事務中進行的更改。 begin while i1000 loop update people set salary = salary + 10*i where id = i; i := i+1; end loop; exception roll back; end; 回滾操作,首先要讀取回滾段信息,并利用這些信息將數(shù)據(jù)庫中已發(fā)生的修改重新恢復。例如,對于使用了update操作的列,則需要將其恢復到原值,而使用了delete操作的行,則需要再次執(zhí)行插入操作。因此,回滾操作所需要的時間和花費的資源,依賴于在事務中所執(zhí)行的數(shù)據(jù)

8、庫更改,并與之成正比。 通常情況下,回滾操作是非常耗費時間和資源的,因此,回滾往往被用于處理異常,而不用作終端用戶的可操作選項。一旦終端用戶經(jīng)常性使用回滾操作,那么將為數(shù)據(jù)庫帶來非常大的負擔。 應當保證終端用戶在提交事務之前進行確認,來代替允許用戶執(zhí)行回滾,從而實現(xiàn)提交與回滾操作的平衡。3 事務的保存點 保存點可以設置在事務中的任何 地方,也可以設置多個點,這樣就將較長的事務分割成較小的段,這樣做的好處是,當對事務的操作發(fā)生問題的時候,只需要回滾到保存點處即可 需要注意以下問題 事務只回滾到保存點之后的操作 回滾到某保存點時候,它之后的保存點將被刪除,但保存點會被保留 保存點以后的鎖將會被釋放

9、3 事務的保存點 insert into users values(05,aa,測試1,123); Savepoint fst; Insert into users values(06,bb,測試2,123); select * from users; rollback to fst; select * from users; Commit; 事務的屬性和隔離級別事務的屬性和隔離級別 事務本身存在著一些屬性,這可以保證事務以某種特定的規(guī)則運行。所謂隔離,是指將事務所能看到的數(shù)據(jù)庫狀態(tài)與其他事務分隔開來 1read only屬性 set transaction read only; insert

10、 into people(id, name, status) values (13, youyou, ACT); commit; 只讀事務的這種特性,可以提供一種穩(wěn)定的狀態(tài),從而處理大量的數(shù)據(jù)查詢工作。例如,在生成復雜報表時,需要查詢大量數(shù)據(jù),而這些數(shù)據(jù)又是頻繁變更的,在處理報表的過程中,可以利用只讀事務來提供穩(wěn)定的環(huán)境,以使生成的報表有意義。 事務的屬性和隔離級別事務的屬性和隔離級別 2read write屬性 read write屬性可以將事務設置為可讀、可寫狀態(tài)。這實際是事務的默認狀態(tài),因此,該屬性的顯式設定,并沒有太大的現(xiàn)實意義。 需要注意的是,一旦使用set transaction

11、read write命令,那么該命令之前,不能出現(xiàn)set transaction命令之外的其他命令。 事務的屬性和隔離級別事務的屬性和隔離級別 3serializable隔離級別 serializable隔離級別是指串行化事務。串行化事務可以實現(xiàn)與只讀事務實現(xiàn)相同的功能隔離其他事務對數(shù)據(jù)庫狀態(tài)的影響。但是串行化事務允許在其中執(zhí)行任何DML操作,包括刪除、修改、插入數(shù)據(jù)等。 在默認情況下,一個事務可以識別其他事務針對數(shù)據(jù)庫的修改,而這種修改僅限于已經(jīng)提交到數(shù)據(jù)庫的修改。使用了串行化事務,那么,其他事務已經(jīng)提交的修改也將被隔離。這里所說的隔離,實際是對于查詢操作來說,也就是串行化事務的處理過程中,

12、無法查看到其他事務的修改。 set transaction isolation level serializable; 事務的屬性和隔離級別事務的屬性和隔離級別 4read commited隔離級別 read commited隔離級別是事務的默認隔離級別,即只能讀取其他事務已經(jīng)提交的修改。對于尚未提交的修改,只有實現(xiàn)該修改的事務本身可以進行讀取。4 事務的特性l原子性(Atomicity):整個事務不可分割,要么全部執(zhí)行,要么都不執(zhí)行。l一致性(Consistency):事務一旦提交生效,會將數(shù)據(jù)庫從一種狀態(tài)轉變?yōu)榱硪环N狀態(tài)。隔離性(Isolation)l隔離性(Isolation): 在事務

13、處理的過程中,事務處理的效果對于其他事務,是完全透明的。l持久性(Durablity):一旦提交了事務處理,那么事務處理的效果將永久生效。隔離性1臟讀?。―irty Read)臟讀取意味著,可以讀取來自外界其他動作對數(shù)據(jù)庫的修改,而這種修改尚未提交,未提交的數(shù)據(jù)有可能回滾。也就是說,讀取的數(shù)據(jù)并非真正有效的數(shù)據(jù),這將直接破壞數(shù)據(jù)一致性。2不可重讀不可重讀意味著,如果用戶在某一時刻讀取了一條記錄,那么,在下一時刻再次讀取時,該記錄已發(fā)生改變。其狀態(tài)類似于“人不能兩次踏入同一條河流”。不可重讀并非不可接受的,相反,不可重讀是一種正常的數(shù)據(jù)庫狀態(tài)。這與臟讀取是有本質區(qū)別的。3影像讀取影像讀取意味著,

14、如果用戶在某一時刻執(zhí)行了一個查詢,在下一時刻再次執(zhí)行相同查詢時,可能會有新的數(shù)據(jù)加入。但是,已經(jīng)讀取的數(shù)據(jù)是不會改變的,只是查詢所獲得結果集更大而已。19.3.4 19.3.4 持久性持久性持久性是指,當事務一旦提交,其改變將會生效,并將信息存儲在磁盤上。當系統(tǒng)再次重新啟動或者故障時,這些信息不會丟失。對于提交動作來說,用戶見到提交成功提示時,Oracle并未完成持久化工作。但是,Oracle數(shù)據(jù)庫利用redo日志文件來保證系統(tǒng)的持久性。redo文件在事務提交的前一刻生成,其中記錄了一旦提交時,系統(tǒng)崩潰,那么該如何將事務的工作再次執(zhí)行,以保證事務真正執(zhí)行完畢,并持久化到數(shù)據(jù)庫。并發(fā)控制并發(fā)控制

15、 并發(fā)是指多用戶同時訪問數(shù)據(jù)庫。并發(fā)能力是衡量數(shù)據(jù)庫性能的重要指標之一,數(shù)據(jù)庫允許并發(fā)數(shù)量越大,標志著該數(shù)據(jù)庫的性能越好。另一方面,并發(fā)會給保持數(shù)據(jù)庫一致性帶來挑戰(zhàn)。Oracle在并發(fā)方面有著卓越的性能,并有著完善的并發(fā)控制機制。什么是鎖 鎖出現(xiàn)在數(shù)據(jù)共享的環(huán)境中,它是一種機制,在訪問相同的資源的時候,可以防止事務之間的破壞性交互。例如:當多個會話同時操作某表的時候,有限操作的會話需要對其鎖定 事務的隔離性要求當前事務不能影響其他事務,所以,當多個會話訪問相同的資源的時候,Oracle 會利用鎖來確保他們想隊列一樣被依次執(zhí)行。Oracle處理數(shù)據(jù)時候用到的鎖匙自動獲取的,我們不用對此有過多的關

16、注,但是Oracle允許我們手動鎖定數(shù)據(jù) 行級鎖:Oracle利用很低的約束提供了最大程度的并發(fā),例如,當某會話正在修改一條記錄,那么僅該條記錄被鎖定,而其他會話可以隨時做讀取操作,讀取的是修改之前的數(shù)據(jù);如果另一回話企圖做跟 更新操作,那么只能等待,這樣可以避免臟數(shù)據(jù)的產(chǎn)生Oracle中鎖的分類 排他鎖(X鎖):也叫寫鎖,這種鎖用作數(shù)據(jù)的修改,加入有事務給數(shù)據(jù)A加上該鎖,那么其他的事務不能對A加任何鎖,所以此時只允許事務T對A進行讀取和修改,直到事務完成所有操作后釋放鎖 共享鎖(S鎖):該模式鎖下的數(shù)據(jù)只能被讀取,不能被修改,如果有事務T給數(shù)據(jù)A加上S鎖,那么其他事務不能對A加排他鎖,但可以

17、加共享鎖,可以保證并發(fā)的讀取。 Oracle數(shù)據(jù)庫中鎖應用頻繁,但是多數(shù)都由自動管理,當事務提交后自動釋放鎖鎖的類型 鎖:該類型的鎖被稱為“數(shù)據(jù)鎖”,用于保護數(shù)據(jù) 鎖:可以保護數(shù)據(jù)庫匯總對象的結構 內部閂鎖:保護數(shù)據(jù)庫的內部結構,完全自動調用 Distributed locks(Distributed locks(分布式鎖) ):用于OPS(OPS(并行服務器) )中; PCM locks(PCM locks(并行高速緩存管理鎖) ):用于OPS(OPS(并行服務器) )中。鎖 鎖主要保證并發(fā)訪問時數(shù)據(jù)的完整性,再細分,分為以下兩種: 行級鎖(),也可以稱為“事務鎖”。當修改表中某行記錄的時候

18、,需要將需要修改的記錄加行級鎖,防止兩個事務修改相同記錄,事務結束,該鎖也會釋放,是粒度最細的鎖,該鎖只能屬于排他鎖。 表級鎖(),主要做用是防止在修改表的數(shù)據(jù)的時候表的結構被其他事務修改。例如:會話在修改表的數(shù)據(jù)時候會得到表A的TM鎖,而此時將不允許其他會話對該表進行變更或者刪除操作(DROP table 或者Alter table等)TXTX鎖(行級鎖、事務鎖) 當一個事務第一次執(zhí)行數(shù)據(jù)更改(Insert、Update、Delete)或使用SELECT FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執(zhí)行COMMIT或ROLLBACK操作)時,該鎖才被釋放。

19、 在Oracle的每行數(shù)據(jù)上,都有一個標志位來表示該行數(shù)據(jù)是否被鎖定。數(shù)據(jù)行上的鎖標志一旦被置位,就表明該行數(shù)據(jù)被加X鎖。TMTM鎖(表級鎖) 引入意向鎖的目的: 表是由行組成的,當向某個表加鎖時,即要檢查該鎖的申請是否與原有的表級鎖相容;還要檢查該鎖是否與表中的每一行上的鎖相容。 如果表中的數(shù)據(jù)很多,逐行檢查鎖標志的開銷將很大,系統(tǒng)的性能將會受到影響。 對任一結點加鎖時,必須先對它的上層結點加意向鎖。 這樣,事務對表加鎖時,就不再需要檢查表中每行記錄的鎖標志位了,系統(tǒng)效率得以大大提高。TMTM鎖(表級鎖) 表級鎖(TM),主要作用是防止在修改表的數(shù)據(jù)的時候,表的結構發(fā)生變化 示例: 會話1:

20、 update users set u_password=1234 where u_id=05; 會話2: drop table users;TMTM鎖的類型 S鎖 X鎖 意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對一個數(shù)據(jù)庫對象加S鎖,首先要對其上級結點加IS鎖,表示它的后裔結點擬(意向)加S鎖; 意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對一個數(shù)據(jù)庫對象加X鎖,首先要對其上級結點加IX鎖,表示它的后裔結點擬(意向)加X鎖。 共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIXSIX鎖):如果對一個數(shù)

21、據(jù)庫對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。封鎖機制 當Oracle執(zhí)行SELECTFOR UPDATE時系統(tǒng)自動在所要操作的表上申請表級IS鎖; 當執(zhí)行INSERT、UPDATE、DELETE等DML語句時系統(tǒng)自動在所要操作的表上申請表級IX鎖; 當表級鎖獲得后,系統(tǒng)再自動申請TX鎖,并將實際鎖定的數(shù)據(jù)行的鎖標志位置位(指向該TX鎖); 可以通過LOCK TABLE語句來指定獲得某種類型的TM鎖。封鎖機制 在Oracle中執(zhí)行DML時自動為表加TM鎖以

22、外,也可以主動為表加TM鎖,語法如下lock table scheme.table inexclusivesharerow exclusiveshare row exclusiverow share*|share update*Mode nowait 如果要釋放它們,只需要使用rollback命令鎖定轉換 在SQL Server等其他數(shù)據(jù)庫中,對于鎖的維護是通過鏈表的數(shù)據(jù)結構。而鏈表容量都會出現(xiàn)瓶頸,一旦鏈表的容量超過了最大限制,將導致鎖定的升級。例如,將某個表上的100個行級鎖定升級為表級鎖定。如果升級成功,那么整個表都被鎖定,其他用戶將無法訪問該表。當然,如果其他用戶也在其他行上設置了獨占

23、鎖,那么鎖定升級將失敗。數(shù)據(jù)庫系統(tǒng)只能花費更多的時間來解決鎖定升級問題。 Oracle中,并不執(zhí)行鎖定升級,而是使用另外一種處理策略鎖定轉換。鎖定轉換與鎖定升級最大的不同在于,鎖定轉換總是盡可能將鎖定限制在較低的級別上。例如,在使用for update語句鎖定表中的某些行之后,除了在被鎖定行上具有獨占鎖之外,也會在整個表上放置row share table lock(在表上放置共享鎖的目的是,其他會話無法獲得該表的獨占鎖,防止獲得表獨占鎖的會話修改表結構。因為修改了表結構,將影響針對數(shù)據(jù)的update操作)。這樣,并不影響其他用戶針對該表的查詢等操作。當實際進行數(shù)據(jù)更新時,將表的row sha

24、re table lock轉換為row exclusive table lock,并執(zhí)行更新操作。 Oracle多粒度封鎖機制的監(jiān)控 為了監(jiān)控系統(tǒng)中鎖的狀況 ,Oracle提供了兩個視圖 V$LOCK視圖列出當前系統(tǒng)持有的或正在申請的所有鎖的情況封鎖機制 V$LOCKED_OBJECTV$LOCKED_OBJECT視圖列出當前系統(tǒng)中哪些對象正被鎖定封鎖機制DDL鎖 也稱為數(shù)據(jù)字典鎖。主要作用保護模式中對象的結構,當執(zhí)行DDL操作的時候,首先Oracle會自動提交一次事務,然后自動給處理對象加鎖;當DDL結束,Oracle會隱式提交事務并釋放DDL鎖,但與DML不同的是,不能顯式要求使用DDL鎖鎖等待與死鎖 用戶沒有良好的編程習慣,偶爾忘記提交事務 操

溫馨提示

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

評論

0/150

提交評論