第7章 事務(wù)與并發(fā)控制_第1頁(yè)
第7章 事務(wù)與并發(fā)控制_第2頁(yè)
第7章 事務(wù)與并發(fā)控制_第3頁(yè)
第7章 事務(wù)與并發(fā)控制_第4頁(yè)
第7章 事務(wù)與并發(fā)控制_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第7章 事務(wù)與并發(fā)控制 當(dāng)用戶建立與數(shù)據(jù)庫(kù)的會(huì)話后,用戶就可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,而用戶對(duì)數(shù)據(jù)庫(kù)的操作是通過(guò)一個(gè)個(gè)事務(wù)來(lái)進(jìn)行的。事務(wù)確保用戶對(duì)數(shù)據(jù)庫(kù)邏輯操作的完整性和一致性,這里的邏輯操作是指用戶根據(jù)業(yè)務(wù)邏輯而進(jìn)行的一系列操作。那什么是事務(wù)? 2本章學(xué)習(xí)目標(biāo): 事務(wù)的概念,主要了解事務(wù)的ACID特性、處理過(guò)程。在Oracle中設(shè)置事務(wù)的隔性層事務(wù)處理語(yǔ)句事務(wù)的并發(fā)控制最基本鎖的作用和使用死鎖的發(fā)生鎖定的多粒度性O(shè)racle中的多粒度意向鎖 37.1 了解事務(wù) 在介紹Oracle 10g的事務(wù)處理之前,首先需要理解什么是數(shù)據(jù)庫(kù)中的事務(wù)。事務(wù)其實(shí)是一個(gè)很簡(jiǎn)單的概念,用戶每天都會(huì)遇到許多現(xiàn)實(shí)生活中類

2、似事務(wù)的示例。例如,商業(yè)活動(dòng)的中的交易,對(duì)于任何一筆交易來(lái)說(shuō),都涉及兩個(gè)基本動(dòng)作:一手交錢和一手交貨。這兩個(gè)動(dòng)作構(gòu)成了一個(gè)完整的商業(yè)交易,缺一不可。也就是說(shuō),這兩個(gè)動(dòng)作都成功發(fā)生,說(shuō)明交易完成;如果只發(fā)生一個(gè)動(dòng)作,則交易失敗。所以,為了保證交易能夠正常完成,需要某種方法來(lái)保證這些操作的整體性,即這些操作要么都成功,要么都失敗。 事務(wù)是數(shù)據(jù)庫(kù)中工作的最小單位,一個(gè)事務(wù)可以由一個(gè)或多個(gè)完成一組相關(guān)行為的SQL語(yǔ)句組成,通過(guò)相應(yīng)機(jī)制保證這組語(yǔ)句所作的操作要么全做,要么全部都不做。是一個(gè)不可分割的整體,如果一個(gè)操作出錯(cuò),整個(gè)事務(wù)會(huì)結(jié)束,保證完整性。數(shù)據(jù)庫(kù)事務(wù) 事務(wù)是由相關(guān)操作構(gòu)成的一個(gè)完整的操作單元。

3、兩次連續(xù)成功的COMMIT或ROLLBACK之間的操作,稱為一個(gè)事務(wù)。在一個(gè)事務(wù)內(nèi),數(shù)據(jù)的修改一起提交或撤銷,如果發(fā)生故障或系統(tǒng)錯(cuò)誤,整個(gè)事務(wù)也會(huì)自動(dòng)撤銷。我們?nèi)ャy行轉(zhuǎn)賬,操作可以分為下面兩個(gè)環(huán)節(jié):(1) 從第一個(gè)賬戶劃出款項(xiàng)。(2) 將款項(xiàng)存入第二個(gè)賬戶。在這個(gè)過(guò)程中,兩個(gè)環(huán)節(jié)是關(guān)聯(lián)的。第一個(gè)賬戶劃出款項(xiàng)必須保證正確的存入第二個(gè)賬戶,如果第二個(gè)環(huán)節(jié)沒有完成,整個(gè)的過(guò)程都應(yīng)該取消,否則就會(huì)發(fā)生丟失款項(xiàng)的問題。整個(gè)交易過(guò)程,可以看作是一個(gè)事物,成功則全部成功,失敗則需要全部撤消,這樣可以避免當(dāng)操作的中間環(huán)節(jié)出現(xiàn)問題時(shí),產(chǎn)生數(shù)據(jù)不一致的問題。數(shù)據(jù)庫(kù)事務(wù)是一個(gè)邏輯上的劃分,有的時(shí)候并不是很明顯,它可

4、以是一個(gè)操作步驟,也可以是多個(gè)操作步驟。我們可以這樣理解數(shù)據(jù)庫(kù)事務(wù):對(duì)數(shù)據(jù)庫(kù)所做的一系列修改,在修改過(guò)程中,暫時(shí)不寫入數(shù)據(jù)庫(kù),而是緩存起來(lái),用戶在自己的終端可以預(yù)覽變化,直到全部修改完成,并經(jīng)過(guò)檢查確認(rèn)無(wú)誤后,一次性提交并寫入數(shù)據(jù)庫(kù),在提交之前,必要的話所做的修改都可以取消。提交之后,就不能撤銷,提交成功后其他用戶才可以通過(guò)查詢?yōu)g覽數(shù)據(jù)的變化。以事務(wù)的方式對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問,有如下的優(yōu)點(diǎn):把邏輯相關(guān)的操作分成了一個(gè)組。在數(shù)據(jù)永久改變前,可以預(yù)覽數(shù)據(jù)變化。能夠保證數(shù)據(jù)的讀一致性。77.2 事務(wù)的ACID特性 一組SQL語(yǔ)句操作要成為事務(wù),數(shù)據(jù)庫(kù)管理系統(tǒng)必須保證這組操作的原子性(Atomicity)

5、、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),這就是事務(wù)的ACID特性。 原子性指事務(wù)中包含操作要么全做要么全不做,作為一個(gè)不可分割的整體存在。銀行轉(zhuǎn)賬過(guò)程:A:2000 取1000沒存入B時(shí),A+B=4000少了1000,但事務(wù)結(jié)束后應(yīng)該繼續(xù)保持5000,只是A成為1000,B成為4000.整體是完整的。B:3000 示例:兩個(gè)更新語(yǔ)句更新數(shù)據(jù)后,如果提交,作為一個(gè)完整整體,不能分割的。 一致性指事務(wù)執(zhí)行前后,數(shù)據(jù)從一種一致性狀態(tài)變?yōu)榱硗庖环N一致性狀態(tài),即必須滿足業(yè)務(wù)規(guī)則約束。比如轉(zhuǎn)賬前后總金額保持不變。事務(wù)處理中間,數(shù)據(jù)可能會(huì)產(chǎn)生短暫的不

6、一致。隔離性指數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其中數(shù)據(jù)進(jìn)行讀寫和修改的能力,可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),由于命令交叉執(zhí)行而導(dǎo)致的數(shù)據(jù)不一致性。A向B轉(zhuǎn)賬中間,A又轉(zhuǎn)入金額,違背了一致性,隔離性保證不會(huì)出現(xiàn)這種情況。持久性指事務(wù)結(jié)束后,對(duì)數(shù)據(jù)的修改應(yīng)該是永久的,即便遇到故障也不會(huì)丟失。127.3 事務(wù)控制語(yǔ)句 在Oracle中沒有提供開始事務(wù)處理語(yǔ)句,所有的事務(wù)都是隱式開始的。也就是說(shuō),在Oracle中用戶不可以顯式使用命令來(lái)開始一個(gè)事務(wù)。Oracle認(rèn)為第一條修改數(shù)據(jù)庫(kù)的語(yǔ)句,或者一些要求事務(wù)處理的場(chǎng)合都是事務(wù)隱式的開始。但是,當(dāng)用戶想要終止一個(gè)事務(wù)處理時(shí),必須顯式使用COMMIT和ROLLBAC

7、K語(yǔ)句結(jié)束。Oracle中事務(wù)相關(guān)操作:Set transactionSet constraintSavepointRollbackcommit數(shù)據(jù)異常丟失修改(錯(cuò)讀)丟失修改(錯(cuò)讀)不可重讀讀讀臟臟數(shù)據(jù)數(shù)據(jù)(假讀)選擇隔離層SQL92隔離級(jí)別。4個(gè)Oracle支持兩個(gè):Read COMMITTED (預(yù)防錯(cuò)讀)-默認(rèn)級(jí)別SERIALIZABLE(串行讀)Oracle支持的其他級(jí)別Read onlyRead write設(shè)置事務(wù)屬性必須位于事務(wù)第一個(gè)語(yǔ)句。事務(wù)結(jié)束設(shè)置自動(dòng)消失??稍O(shè)置的屬性:指定事務(wù)隔離層規(guī)定回滾事務(wù)時(shí)使用的存儲(chǔ)空間(很少使用)命名事務(wù)(分布式事務(wù)中使用)建立set transa

8、ction語(yǔ)句Set transaction read only避免非重復(fù)讀和假讀Set transaction read write(默認(rèn))Set transaction isolation level read committed(適合并發(fā)用戶多情況)Set transaction isolation level serializable(適合用戶少情況)幾個(gè)選項(xiàng)是互斥的。結(jié)束事務(wù)結(jié)束事務(wù)的幾種情況:CommitRollback斷開了連接(exit)commit;進(jìn)程意外終止(rollback)Commit提交事務(wù)需要完成如下任務(wù):記錄事務(wù)提交到回滾段,產(chǎn)生scn啟動(dòng)lgwr,日志和scn

9、號(hào)保存到日志服務(wù)器進(jìn)程釋放事務(wù)處理進(jìn)程中所使用的資源通知用戶事務(wù)已經(jīng)成功提交回滾事務(wù)Rollback語(yǔ)句?;貪L需要很大系統(tǒng)開銷,有必要時(shí)才回滾。存儲(chǔ)點(diǎn)事務(wù)非常龐大時(shí),可以使用存儲(chǔ)點(diǎn),從而使回滾操作可以實(shí)現(xiàn)部分事務(wù)的回滾。Savepoint 存儲(chǔ)點(diǎn)名字?jǐn)?shù)據(jù)庫(kù)事務(wù)處理可分為隱式和顯式兩種。顯式事務(wù)操作通過(guò)命令實(shí)現(xiàn),隱式事務(wù)由系統(tǒng)自動(dòng)完成提交或撤銷(回退)工作,無(wú)需用戶的干預(yù)。隱式提交的情況包括:當(dāng)用戶正常退出SQL*Plus或執(zhí)行CREATE、DROP、GRANT、REVOKE等命令時(shí)會(huì)發(fā)生事務(wù)的自動(dòng)提交。2 數(shù)據(jù)庫(kù)事務(wù)的應(yīng)用還 有 一 種 情 況 , 如 果 把 系 統(tǒng) 的 環(huán) 境 變 量AUT

10、OCOMMIT設(shè)置為ON(默認(rèn)狀態(tài)為OFF),則每當(dāng)執(zhí)行一條INSERT、DELETE或UPDATE命令對(duì)數(shù)據(jù)進(jìn)行修改后,就會(huì)馬上自動(dòng)提交。設(shè)置命令格式如下:SET AUTOCOMMIT ON/OFF隱式回退的情況包括:當(dāng)異常結(jié)束SQL*Plus或系統(tǒng)故障發(fā)生時(shí),會(huì)發(fā)生事務(wù)的自動(dòng)回退。顯式事務(wù)處理的數(shù)據(jù)庫(kù)事務(wù)操作語(yǔ)句有3條,如表3-2所示。數(shù)據(jù)在修改的時(shí)候會(huì)對(duì)記錄進(jìn)行鎖定,其他會(huì)話不能對(duì)鎖定的記錄進(jìn)行修改或加鎖,只有當(dāng)前會(huì)話提交或撤銷后,記錄的鎖定才會(huì)釋放。詳細(xì)內(nèi)容見下一節(jié)。我們通過(guò)以下的訓(xùn)練來(lái)為雇員SCOTT增加工資,SCOTT的雇員號(hào)為7788。 表2 事務(wù)控制語(yǔ)句語(yǔ) 句 描 述 COMM

11、IT 數(shù)據(jù)庫(kù)事務(wù)提交,將變化寫入數(shù)據(jù)庫(kù) ROLLBACK 數(shù)據(jù)庫(kù)事務(wù)回退,撤銷對(duì)數(shù)據(jù)的修改 SAVEPOINT 創(chuàng)建保存點(diǎn),用于事務(wù)的階段回退 COMMIT操作把多個(gè)步驟對(duì)數(shù)據(jù)庫(kù)的修改,一次性地永久寫入數(shù)據(jù)庫(kù),代表數(shù)據(jù)庫(kù)事務(wù)的成功執(zhí)行。ROLLBACK操作在發(fā)生問題時(shí),把對(duì)數(shù)據(jù)庫(kù)已經(jīng)作出的修改撤消,回退到修改前的狀態(tài)。在操作過(guò)程中,一旦發(fā)生問題,如果還沒有提交操作,則隨時(shí)可以使用ROLLBACK來(lái)撤消前面的操作。SAVEPOINT則用于在事務(wù)中間建立一些保存點(diǎn),ROLLBACK可以使操作回退到這些點(diǎn)上邊,而不必撤銷全部的操作。一旦COMMIT完成,就不能用ROLLBACK來(lái)取消已經(jīng)提交的操作。

12、一旦ROLLBACK完成,被撤消的操作要重做,必須重新執(zhí)行相關(guān)操作語(yǔ)句。如何開始一個(gè)新的事務(wù)呢?一般情況下,開始一個(gè)會(huì)話(即連接數(shù)據(jù)庫(kù)),執(zhí)行第一條SQL語(yǔ)句將開始一 個(gè) 新 的 事 務(wù) , 或 執(zhí) 行 C O M M I T 提 交 或ROLLBACK撤銷事務(wù),也標(biāo)志新的事務(wù)的開始。另外,執(zhí)行DDL(如CREATE)或DCL命令也將自動(dòng)提交前一個(gè)事務(wù)而開始一個(gè)新的事務(wù)?!居?xùn)練1】 學(xué)習(xí)使用COMMIT和ROLLBACK。步驟1:執(zhí)行以下命令,提交尚未提交的操作:COMMIT;執(zhí)行結(jié)果:提交完成。顯示SCOTT的現(xiàn)有工資:SELECT ename,sal FROM emp WHERE empn

13、o=7788;執(zhí)行結(jié)果:ENAME SAL- -SCOTT 3000步驟2:修改雇員SCOTT的工資:UPDATE emp SET sal=sal+100 WHERE empno=7788;執(zhí)行結(jié)果:已更新1行。顯示修改后的SCOTT的工資:SELECT ename,sal FROM emp WHERE empno=7788;執(zhí)行結(jié)果:ENAME SAL- -SCOTT 3100步驟3:假定修改操作后發(fā)現(xiàn)增加的工資應(yīng)該為1000而不是100,為了取消剛做的操作,可以執(zhí)行以下命令:ROLLBACK;執(zhí)行結(jié)果:回退已完成。顯示回退后SCOTT的工資恢復(fù)為3000:SELECT ename,sal

14、FROM emp WHERE empno=7788;執(zhí)行結(jié)果:ENAME SAL- -SCOTT 3000步驟4:重新修改雇員SCOTT的工資,工資在原有基礎(chǔ)上增加1000:UPDATE emp SET sal=sal+1000 WHERE empno=7788;執(zhí)行結(jié)果:已更新 1 行。顯示修改后SCOTT的工資:SELECT ename,sal FROM emp WHERE empno=7788;執(zhí)行結(jié)果:ENAME SAL- -SCOTT 4000步驟5:經(jīng)查看修改結(jié)果正確,提交所做的修改:COMMIT;執(zhí)行結(jié)果:提交完成。 說(shuō)明:在執(zhí)行COMMIT后,工資的修改被永久寫入數(shù)據(jù)庫(kù)。本訓(xùn)練

15、的第1步,先使用COMMIT命令提交原來(lái)的操作,同時(shí)標(biāo)志一個(gè)新的事務(wù)的開始。注意:在事務(wù)執(zhí)行過(guò)程中,隨時(shí)可以預(yù)覽數(shù)據(jù)的變化。對(duì)于比較大的事務(wù),可以使用SAVEPOINT命令在事務(wù)中間劃分一些斷點(diǎn),用來(lái)作為回退點(diǎn)。【訓(xùn)練2】 學(xué)習(xí)使用SAVEPOINT命令。步驟1:插入一個(gè)雇員:INSERT INTO emp(empno, ename, job)VALUES (3000, 小馬,STUDENT);執(zhí)行結(jié)果:已創(chuàng)建 1 行。步驟2:插入保存點(diǎn),檢查點(diǎn)的名稱為PA:SAVEPOINT pa;執(zhí)行結(jié)果:保存點(diǎn)已創(chuàng)建。步驟3:插入另一個(gè)雇員:INSERT INTO emp(empno, ename, j

16、ob)VALUES (3001, 小黃,STUDENT);執(zhí)行結(jié)果:已創(chuàng)建 1 行。 步驟4:回退到保存點(diǎn)PA,則后插入的小黃被取消,而小馬仍然保留。ROLLBACK TOpa;執(zhí)行結(jié)果:回退已完成。步驟5: 提交所做的修改:COMMIT;執(zhí)行結(jié)果:提交完成。說(shuō)明:第4步的回退,將回退到保存點(diǎn)PA,即第3步被撤銷。所以最后的COMMIT只提交了對(duì)小馬的插入。請(qǐng)自行檢查插入的雇員?!揪毩?xí)1】對(duì)emp表進(jìn)行修改,然后退出SQL*Plus,重新啟動(dòng)SQL*Plus,檢查所做的修改是否生效。在Oracle數(shù)據(jù)庫(kù)中,有一個(gè)叫回滾段的特殊的存儲(chǔ)區(qū)域。在提交一個(gè)事物之前,如果用戶進(jìn)行了數(shù)據(jù)的修改,在所謂的回

17、滾段中將保存變化前的數(shù)據(jù)。有了回滾段才能在必要時(shí)使用ROLLBACK命令或自動(dòng)地進(jìn)行數(shù)據(jù)撤銷。在提交事物之前,用戶自己可以看到修改的數(shù)據(jù),但因?yàn)樾薷倪€沒有最終提交,其他用戶看到的應(yīng)該是原來(lái)的數(shù)據(jù),也就是回滾段中的數(shù)據(jù),這時(shí)用戶自己看到的數(shù)據(jù)和其他用戶看到的數(shù)據(jù)是不同的,只有提交發(fā)生后,變化的數(shù)據(jù)才會(huì)被寫入數(shù)據(jù)庫(kù),此時(shí)用戶自己看到的數(shù)據(jù)和其他用戶看到的數(shù)據(jù)才是一致的,這叫做數(shù)據(jù)的讀一致性?!居?xùn)練3】 觀察數(shù)據(jù)的讀一致性。步驟1:顯示剛插入的雇員小馬:SELECT empno,ename FROM emp WHERE empno=3000;執(zhí)行結(jié)果: EMPNO ENAME- - 3000 小馬步

18、驟2:刪除雇員小馬:DELETE FROM emp WHERE empno=3000;執(zhí)行結(jié)果:已刪除 1 行。步驟3:再次顯示該雇員,顯示結(jié)果為該雇員不存在:SELECT empno,ename FROM emp WHERE empno=3000;執(zhí)行結(jié)果:未選定行 步驟4:另外啟動(dòng)第2個(gè)SQL*Plus,并以SCOTT身份連接。執(zhí)行以下命令,結(jié)果為該記錄依舊存在。SELECT empno,ename FROM emp WHERE empno=3000;執(zhí)行結(jié)果: EMPNO ENAME- - 3000 小馬步驟5:在第1個(gè)SQL*Plus中提交刪除:COMMIT;執(zhí)行結(jié)果:提交完成。步驟6

19、:在第2個(gè)SQL*Plus中再次顯示該雇員,顯示結(jié)果與步驟3的結(jié)果一致:SELECT empno,ename FROM emp WHERE empno=3000;執(zhí)行結(jié)果:未選定行 說(shuō)明:在以上訓(xùn)練中,當(dāng)?shù)?個(gè)SQL*Plus會(huì)話刪除小馬后,第2個(gè)SQL*Plus會(huì)話仍然可以看到該雇員,直到第1個(gè)SQL*Plus會(huì)話提交該刪除操作后,兩個(gè)會(huì)話看到的才是一致的數(shù)據(jù)。397.4 并發(fā)控制 對(duì)于多用戶數(shù)據(jù)庫(kù)系統(tǒng)而言,當(dāng)多個(gè)用戶并發(fā)地操作時(shí),會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)操作同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)發(fā)生讀取和寫入不正確的數(shù)據(jù),破壞數(shù)據(jù)庫(kù)的一致性。所以數(shù)據(jù)庫(kù)管理系統(tǒng)必須提供并發(fā)控制機(jī)制。因此,一

20、個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)性能的優(yōu)劣,很大一部分取決于并發(fā)控制。并發(fā)控制是指使用正確的方式實(shí)現(xiàn)事務(wù)的并發(fā)操作,避免數(shù)據(jù)的不一致性。主要通過(guò)鎖機(jī)制保證并發(fā)控制的。鎖是控制共享資源并發(fā)訪問的一種機(jī)制。由oracle系統(tǒng)自動(dòng)管理。用戶也可以給資源手工加鎖,封鎖開始于事務(wù)開始,結(jié)束于事務(wù)結(jié)束。鎖的分類:DDL鎖,自動(dòng)發(fā)布和釋放DML鎖:事務(wù)開始時(shí)施加,結(jié)束時(shí)釋放內(nèi)部鎖(保護(hù)內(nèi)部數(shù)據(jù)庫(kù)結(jié)構(gòu)的鎖,oracle來(lái)自動(dòng)管理)注:前兩者可以由用戶直接或間接控制鎖模式Oracle中鎖的模式:S鎖共享鎖X鎖排他鎖RS鎖行級(jí)共享鎖RX鎖行級(jí)排他鎖SRX鎖共享行級(jí)排他鎖鎖的相容性:兩個(gè)鎖能否同時(shí)作用于同一內(nèi)容:p328所示DML

21、語(yǔ)句自動(dòng)使用RX鎖,DDLcreate使用S鎖,alter使用X鎖Lock table語(yǔ)句 +表名+in row share mode鎖模式的驗(yàn)證7.5 鎖粒度 鎖粒度是指被鎖定的數(shù)據(jù)對(duì)象的大小。鎖粒度與數(shù)據(jù)庫(kù)系統(tǒng)的并發(fā)度和并發(fā)控制的開銷密切相關(guān)。鎖粒度越大,數(shù)據(jù)庫(kù)中所能夠使用的資源也就越少,并發(fā)度也就越小,系統(tǒng)開銷也就越?。环粗?,鎖的粒度越小,并發(fā)度也就越大,但系統(tǒng)的開銷也就越大。 選擇鎖粒度時(shí)要對(duì)并發(fā)度和系統(tǒng)開銷進(jìn)行權(quán)衡。一般情況下,事務(wù)中要處理大量記錄時(shí),鎖粒度應(yīng)為表級(jí)。要處理多個(gè)表中大量記錄時(shí),一般應(yīng)為數(shù)據(jù)庫(kù)級(jí)。對(duì)于少量記錄的處理,為行級(jí)。分四個(gè)級(jí)別:數(shù)據(jù)庫(kù)級(jí)表級(jí)行級(jí)列級(jí)TX鎖和TM鎖

22、TX-事務(wù)鎖(行級(jí)鎖),事務(wù)執(zhí)行數(shù)據(jù)更改操作獲得TX鎖,直至事務(wù)結(jié)束,釋放,可以鎖定多行。行級(jí)別沒有S鎖,只有X鎖TM鎖表級(jí)鎖,五種模式數(shù)據(jù)庫(kù)級(jí)鎖Alter system enable restricted session;-其他用戶不允許登陸。 sysdba權(quán)限取消限制: Alter system disable restricted sessionAlter database open read only;-先執(zhí)行shutdown immediate,然后執(zhí)行startup mount已經(jīng)連接的用戶不會(huì)受到前者語(yǔ)句的影響。可以使用alter system quiesce restricte

23、d(靜默模式)語(yǔ)句從用戶活動(dòng)中鎖定數(shù)據(jù)庫(kù)。此模式下,其他用戶登錄和執(zhí)行sql語(yǔ)句都不提示錯(cuò)誤,而是一直等待。在命令行表現(xiàn)為語(yǔ)句或登錄行為停著不動(dòng)了,不被執(zhí)行 .取消靜默:ALTER SYSTEM UNQUIESCE ;sysdba權(quán)限7.6 查詢鎖 Oracle將當(dāng)前鎖的信息存儲(chǔ)在數(shù)據(jù)字典的動(dòng)態(tài)性能視圖V$LOCK和V$LOCKED_OBJECT中。其中,V$LOCK視圖列出當(dāng)前系統(tǒng)持有的,或者正在申請(qǐng)的所有鎖的情況,其主要字段說(shuō)明如表7-6所示: V$locked_object列出哪些對(duì)象正被鎖定。OEM工具查看鎖:主目錄性能其他監(jiān)視鏈接-數(shù)據(jù)庫(kù)鎖7.7 死鎖 如果對(duì)數(shù)據(jù)對(duì)象加鎖不當(dāng),就會(huì)發(fā)

24、生死鎖。死鎖是指在兩個(gè)以上的事務(wù)中,每個(gè)事務(wù)都因?yàn)樵噲D加鎖當(dāng)前已被另一個(gè)事務(wù)加鎖的數(shù)據(jù)項(xiàng),從而造成的相互等待現(xiàn)象。 3 表的鎖定1 鎖的概念鎖出現(xiàn)在數(shù)據(jù)共享的場(chǎng)合,用來(lái)保證數(shù)據(jù)的一致性。當(dāng)多個(gè)會(huì)話同時(shí)修改一個(gè)表時(shí),需要對(duì)數(shù)據(jù)進(jìn)行相應(yīng)的鎖定。鎖有“只讀鎖”、“排它鎖”,“共享排它鎖”等多種類型,而且每種類型又有“行級(jí)鎖”(一次鎖住一條記錄),“頁(yè)級(jí)鎖”(一次鎖住一頁(yè),即數(shù)據(jù)庫(kù)中存儲(chǔ)記錄的最小可分配單元),“表級(jí)鎖”(鎖住整個(gè)表)。 若為“行級(jí)排它鎖”,則除被鎖住的行外,該表中其他行均可被其他的用戶進(jìn)行修改(Update)或刪除(delete)。若為“表級(jí)排它鎖”,則所有其他用戶只能對(duì)該表進(jìn)行查詢

25、(select)操作,而無(wú)法對(duì)其中的任何記錄進(jìn)行修改或刪除。當(dāng)程序?qū)λ龅男薷倪M(jìn)行提交(commit)或回滾(rollback)后,鎖住的資源便會(huì)得到釋放,從而允許其他用戶進(jìn)行操作。 有時(shí),由于程序的原因,鎖住資源后長(zhǎng)時(shí)間未對(duì)其工作進(jìn)行提交;或是由于用戶的原因,調(diào)出需要修改的數(shù)據(jù)后,未及時(shí)修改并提交,而是放置于一旁;或是由于客戶服務(wù)器方式中客戶端出現(xiàn)“死機(jī)”,而服務(wù)器端卻并未檢測(cè)到,從而造成鎖定的資源未被及時(shí)釋放,影響到其他用戶的操作。如果兩個(gè)事務(wù),分別鎖定一部分?jǐn)?shù)據(jù),而都在等待對(duì)方釋放鎖才能完成事務(wù)操作,這種情況下就會(huì)發(fā)生死鎖。2 隱式鎖和顯式鎖在Oracle數(shù)據(jù)庫(kù)中,修改數(shù)據(jù)操作時(shí)需要一個(gè)

26、隱式的獨(dú)占鎖,以鎖定修改的行,直到修改被提交或撤銷為止。如果一個(gè)會(huì)話鎖定了數(shù)據(jù),那么第二個(gè)會(huì)話要想對(duì)數(shù)據(jù)進(jìn)行修改,只能等到第一個(gè)會(huì)話對(duì)修改使用COMMIT命令進(jìn)行提交或使用ROLLBACK命令進(jìn)行回滾撤銷后,才開始執(zhí)行。因此應(yīng)養(yǎng)成一個(gè)良好的習(xí)慣:執(zhí)行修改操作后,要盡早地提交或撤銷,以免影響其他會(huì)話對(duì)數(shù)據(jù)的修改。【訓(xùn)練1】 對(duì)emp表的SCOTT雇員記錄進(jìn)行修改,測(cè)試隱式鎖。步驟1:?jiǎn)?dòng)第一個(gè)SQL*Plus,以SCOTT賬戶登錄數(shù)據(jù)庫(kù)(第一個(gè)會(huì)話),修改SCOTT記錄,隱式加鎖。UPDATE emp SET sal=3500 where empno=7788;執(zhí)行結(jié)果:已更新 1 行。步驟2:

27、啟動(dòng)第二個(gè)SQL*Plus,以SCOTT賬戶登錄數(shù)據(jù)庫(kù)(第二個(gè)會(huì)話),進(jìn)行記錄修改操作。UPDATE emp SET sal=4000 where empno=7788;執(zhí)行結(jié)果,沒有任何輸出(處于等待解鎖狀態(tài))。步驟3:對(duì)第一個(gè)會(huì)話進(jìn)行解鎖操作:COMMIT;步驟4:查看第二個(gè)會(huì)話,此時(shí)有輸出結(jié)果:已更新 1 行。步驟5:提交第二個(gè)會(huì)話,防止長(zhǎng)時(shí)間鎖定。說(shuō)明:兩個(gè)會(huì)話對(duì)同一表的同一條記錄進(jìn)行修改。步驟1修改SCOTT工資為3500,沒有提交或回滾之前,SCOTT記錄處于加鎖狀態(tài)。步驟2的第二個(gè)會(huì)話對(duì)SCOTT進(jìn)行修改處于等待狀態(tài)。步驟3解鎖之后(即第一個(gè)會(huì)話對(duì)SCOTT的修改已經(jīng)完成),第二

28、個(gè)會(huì)話掛起的修改此時(shí)可以執(zhí)行。最后結(jié)果為第二個(gè)會(huì)話的修改結(jié)果,即SCOTT的工資修改為4000。讀者可以使用查詢語(yǔ)句檢查。以上是隱式加鎖,用戶也可以使用如下兩種方式主動(dòng)鎖定行或表,防止其他會(huì)話對(duì)數(shù)據(jù)的修改。表3-3是對(duì)行或表進(jìn)行鎖定的語(yǔ)句。表3 表的顯式鎖定操作語(yǔ)句語(yǔ) 句 描 述 SELECT FOR UPDATE 鎖定表行,防止其他會(huì)話對(duì)行的修改 LOCK TABLE 鎖定表,防止其他會(huì)話對(duì)表的修改 3 鎖定行 【訓(xùn)練1】 對(duì)emp表的部門10的雇員記錄加顯式鎖,并測(cè)試。步驟1:對(duì)部門10加顯式鎖:SELECT empno,ename,job,sal FROM emp WHERE deptn

29、o=10 FOR UPDATE;結(jié)果為: EMPNO ENAME JOB SAL- - - - 7782 CLARK MANAGER 2450 7839 KING PRESIDENT 5000 7934 MILLER CLERK 700步驟2:?jiǎn)?dòng)第二個(gè)SQL*Plus(第二個(gè)會(huì)話),以SCOTT賬戶登錄數(shù)據(jù)庫(kù),對(duì)部門10的雇員CLARK進(jìn)行修改操作。UPDATE emp SET sal=sal+100 where empno=7782;執(zhí)行結(jié)果:沒有任何輸出(處于等待解鎖狀態(tài))。步驟3:在第一個(gè)會(huì)話進(jìn)行解鎖操作:COMMIT;步驟4:查看第二個(gè)會(huì)話,有輸出結(jié)果:已更新 1 行。說(shuō)明:步驟1對(duì)

30、選定的部門10的雇員加鎖,之后其他會(huì)話不能對(duì)部門10的雇員數(shù)據(jù)進(jìn)行修改或刪除。如果此時(shí)要進(jìn)行修改或刪除,則會(huì)處于等待狀態(tài)。使用COMMIT語(yǔ)句進(jìn)行解鎖之后,如果有掛起的修改或刪除操作,則等待的操作此時(shí)可以執(zhí)行。4 鎖定表LOCK語(yǔ)句用于對(duì)整張表進(jìn)行鎖定。語(yǔ)法如下:LOCK TABLE 表名 IN SHARE|EXCLUSIVE MODE對(duì)表的鎖定可以是共享(SHARE)或獨(dú)占(EXCLUSIVE)模式。共享模式下,其他會(huì)話可以加共享鎖,但不能加獨(dú)占鎖。在獨(dú)占模式下,其他會(huì)話不能加共享或獨(dú)占鎖?!居?xùn)練1】 對(duì)emp表添加獨(dú)占鎖。步驟1:對(duì)emp表加獨(dú)占鎖:LOCK TABLE emp IN EX

31、CLUSIVE MODE;結(jié)果為:表已鎖定。步驟2:對(duì)表進(jìn)行解鎖操作:COMMIT;說(shuō)明:當(dāng)使用LOCK語(yǔ)句顯式鎖定一張表時(shí),死鎖的概率就會(huì)增加。同樣地,使用COMMIT或ROLLBACK命令可以釋放鎖。 注意:必須沒有其他會(huì)話對(duì)該表的任何記錄加鎖,此操作才能成功?!揪毩?xí)1】通過(guò)兩個(gè)會(huì)話以共享方式鎖定dept表,然后分別釋放。階段訓(xùn)練【訓(xùn)練1】 以數(shù)據(jù)庫(kù)事務(wù)方式將SCOTT從emp表轉(zhuǎn)入manager表,再將SCOTT的工資改成和emp表的KING的工資一樣。步驟1:復(fù)制emp表的SCOTT到manager表:INSERT INTO manager SELECT empno,ename,sal FROM emp WHERE empno=7788;執(zhí)行結(jié)果:已創(chuàng)建 1 行。步驟2:刪除emp表的SCOTT:DELETE FROM emp WHERE empno=7788;執(zhí)行結(jié)果:已刪除 1 行。步驟3:修改SCOTT的工資:UPD

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論