oracle根據(jù)操作資源的類型把鎖分哪幾類

本篇內(nèi)容介紹了“oracle根據(jù)操作資源的類型把鎖分哪幾類”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比息縣網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式息縣網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋息縣地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。

數(shù)據(jù)庫鎖概述

       oracle在事務(wù)執(zhí)行會(huì)自動(dòng)對操作資源進(jìn)行鎖定,防止其它事務(wù)對同一個(gè)資源做破壞性存取。數(shù)據(jù)庫自動(dòng)根據(jù)操作資源類型不同,對資源加上各種類型的鎖。

        oracle根據(jù)操作資源的類型,把鎖分為如下分類

  •          DML鎖:保護(hù)數(shù)據(jù),例如表鎖鎖定這個(gè)表,行級鎖鎖定選擇的行

  •          DDL鎖:保護(hù)對象的定義,例如表和視圖的數(shù)據(jù)字典

  •          系統(tǒng)鎖:保護(hù)內(nèi)部數(shù)據(jù)庫的結(jié)構(gòu),例如數(shù)據(jù)文件,latch,mutexes和內(nèi)部鎖定,這些都是自動(dòng)實(shí)現(xiàn)的

dml鎖

     一個(gè)DML鎖,又叫做數(shù)據(jù)鎖,用來保證多個(gè)用戶并發(fā)事務(wù)執(zhí)行時(shí)的數(shù)據(jù)完整性。

例如:一個(gè)DML鎖可以防止兩個(gè)用戶在在線商店購買最后一本書。DML語句自動(dòng)獲取如下類型的鎖:行級鎖TX和表鎖TM

示例

    SQL> update t_test set a=1;

    2 rows updated.

可見 產(chǎn)生事務(wù)會(huì) 在原有基礎(chǔ)上添加2種鎖,一為表鎖tm,其鎖模式為行級排它鎖,二為行鎖tx,其鎖模式為排它鎖

SQL> /

    SID TY     ID1 ID2 LMODE  REQUEST

---------- -- ---------- ---------- ---------- ----------

25 AE     133  0     4 0

25 TX   65566      1359 6 0  dml鎖

25 TM   76989  0     3 0  dml鎖

SQL> desc dba_dml_locks;

 Name   Null?    Type

 ----------------------------------------- -------- ----------------------------

 SESSION_ID    NUMBER

 OWNER   NOT NULL VARCHAR2(128)

 NAME   NOT NULL VARCHAR2(128)

 MODE_HELD    VARCHAR2(13)

 MODE_REQUESTED    VARCHAR2(13)

 LAST_CONVERT    NUMBER

 BLOCKING_OTHERS    VARCHAR2(40)

SQL> select session_id,owner,name,mode_held,mode_requested,last_convert,blocking_others from dba_dml_locks

SESSION_ID OWNER NAME     MODE_HELD   MODE_REQUESTE LAST_CONVERT BLOCKING_OTHERS

---------- -------------------- -------------------- ------------- ------------- ------------ ----------------------------------------

25     USER_DDL T_TEST     Row-X (SX)    None 1052         Not Blocking

        oracle在鎖定行所在的數(shù)據(jù)塊(事務(wù)需要修改的數(shù)據(jù)塊)中存儲(chǔ)鎖的相關(guān)信息。數(shù)據(jù)庫使用隊(duì)列機(jī)制獲取行級鎖,如果事務(wù)需要一個(gè)未鎖定行的鎖,那么事務(wù)在數(shù)據(jù)塊中在放一個(gè)鎖,事務(wù)修改的每一行都會(huì)指向數(shù)據(jù)塊頭部(ITL)中的事務(wù)ID。當(dāng)事務(wù)結(jié)束時(shí),事務(wù)ID仍然留在數(shù)據(jù)塊頭部的ITL中。如果不同的事務(wù)想要修改一行數(shù)據(jù),數(shù)據(jù)庫會(huì)使用ITL中原來事務(wù)的ID,通過查詢相關(guān)動(dòng)態(tài)視圖判斷事務(wù)是否還存在,及鎖是否存在,如果鎖仍然是活動(dòng)的,那么會(huì)話排隊(duì)等待事務(wù)結(jié)束后的通知,如果鎖不活動(dòng)了,那么,事務(wù)得到鎖,并更新ITL表

小結(jié)

  •    oracle會(huì)在數(shù)據(jù)塊中記錄鎖的信息及事務(wù)的信息

  •    oracle會(huì)話如需要獲取表記錄的鎖,先查找表記錄所屬數(shù)據(jù)塊是否已存在鎖,在數(shù)據(jù)塊中存儲(chǔ)事務(wù)及鎖的數(shù)據(jù)結(jié)構(gòu)叫itl

  •    itl在數(shù)據(jù)塊的頭塊

  •    oracle會(huì)話發(fā)現(xiàn)修改數(shù)據(jù)塊有活動(dòng)事務(wù),即持鎖,它會(huì)等待

  •    oracle dml鎖是采用排隊(duì)機(jī)制實(shí)現(xiàn)即先到先到,后到后等算法

  •    oracle的在獲取到數(shù)據(jù)塊進(jìn)行修改時(shí),需要在數(shù)據(jù)塊頭部的itl修改數(shù)據(jù)塊的事務(wù)狀態(tài),表明數(shù)據(jù)塊正被修改

  •    tm鎖即表鎖,會(huì)有5種不同的鎖模式,之前文章講過,不再復(fù)述

ddl鎖

       當(dāng)DDL操作或者關(guān)聯(lián)操作某對象時(shí),DDL鎖保護(hù)對象的定義。只有在DDL語句中修改或者引用的對象才被鎖定,數(shù)據(jù)庫不會(huì)鎖定整個(gè)數(shù)據(jù)字典。oracle數(shù)據(jù)庫代表DDL事務(wù)自動(dòng)實(shí)現(xiàn)DDL鎖。

       用戶不能顯式獲得DDL鎖。例如,一個(gè)用戶創(chuàng)建一個(gè)存儲(chǔ)過程,數(shù)據(jù)庫自動(dòng)獲得存儲(chǔ)過程中引入的對象的DDL鎖。DDL鎖阻止存儲(chǔ)過程編譯過程中這些對象的修改和刪除

小結(jié)

  •     ddl鎖保存數(shù)據(jù)定義的數(shù)據(jù)結(jié)構(gòu)

  •     ddl鎖只有在修改數(shù)據(jù)定義的數(shù)據(jù)結(jié)構(gòu)或引用數(shù)據(jù)定義的數(shù)據(jù)結(jié)構(gòu),才會(huì)持有ddl鎖

  •     修改數(shù)據(jù)定義的數(shù)據(jù)結(jié)構(gòu)操作,比如:create table,alter table類似的語句

  •     引用數(shù)據(jù)定義的數(shù)據(jù)結(jié)構(gòu)操作,比如:基于源表創(chuàng)建存儲(chǔ)過程或調(diào)用執(zhí)行存儲(chǔ)過程(因?yàn)楸仨毐WC在執(zhí)行存儲(chǔ)過程期間依賴基表的完整性)

  •     ddl鎖由oracle自身控制,人為無法控制,無法顯式獲取ddl鎖

  •     ddl鎖一般看不到,因?yàn)閐dl操作極快

  •     ddl鎖底層是通過鎖定數(shù)據(jù)字典實(shí)現(xiàn)

SQL> desc dba_ddl_locks;

 Name   Null?    Type

 ----------------------------------------- -------- ----------------------------

 SESSION_ID    NUMBER

 OWNER    VARCHAR2(128)

 NAME    VARCHAR2(1000)

 TYPE    VARCHAR2(40)

 MODE_HELD    VARCHAR2(9)

 MODE_REQUESTED    VARCHAR2(9)

即使沒有執(zhí)行數(shù)據(jù)庫事務(wù),仍存在ddl鎖,下述ddl鎖就是保護(hù)各種對象類型的定義結(jié)構(gòu)不被破壞

SQL> select session_id,owner,name,type,mode_held,mode_requested from dba_ddl_locks;

SESSION_ID OWNER NAME     TYPE      MODE_HELD MODE_REQU

---------- -------------------- -------------------- ---------------------------------------- --------- ---------

32 SYS KUPU$UTILITIES     Table/Procedure/Type      Null None

32 SYS STANDARD     Table/Procedure/Type      Null None

32 SYS STANDARD     Table/Procedure/Type      Null None

32 SYS DBMS_PRVT_TRACE      Table/Procedure/Type      Null None

74 SYSTEM SYSTEM     18      Null None

76 SYSTEM SYSTEM     18      Null None

75 SYSTEM SYSTEM     18      Null None

74 SYS DBMS_OUTPUT     Body      Null No     

SQL> grant execute on dbms_lock to system;

Grant succeeded.

create or replace procedure proc_t_test

as

v_cnt int;

begin

dbms_lock.sleep(300);

select count(a) into v_cnt from t_test;

end;

/

--未執(zhí)行相關(guān)與DDL前2個(gè)測試會(huì)話各為25及74的運(yùn)行信息

SQL> select session_id,owner,name,type,mode_held,mode_requested from dba_ddl_locks where session_id in (25,74)

SESSION_ID OWNER   NAME      TYPE       MODE_HELD MODE_REQU

---------- --------------- -------------------------------------------------- ---------------------------------------- --------- ---------

25 SYSTEM   SYSTEM          18            Null None

74 SYSTEM   SYSTEM          18            Null None

74 SYS   DBMS_OUTPUT      Body            Null None

25 SYS   DBMS_LOCK      Body            Null None

74 SYS   DBMS_OUTPUT      Table/Procedure/Type    Null None

25 LBACSYS   LBAC_EVENTS      Body            Null None

25 LBACSYS   LBAC_EVENTS      Table/Procedure/Type    Null None

25 SYS   DBMS_APPLICATION_INFO  Body            Null None

74 SYS   DBMS_APPLICATION_INFO  Body            Null None

25 SYS   DBMS_STANDARD      Table/Procedure/Type    Null None

74 SYS   PLITBLM          Table/Procedure/Type    Null None

SESSION_ID OWNER   NAME      TYPE       MODE_HELD MODE_REQU

---------- --------------- -------------------------------------------------- ---------------------------------------- --------- ---------

74       SYSTEM          73            Share None

25       SYSTEM          73            Share None

25 SYS   DBMS_APPLICATION_INFO  Table/Procedure/Type    Null None

74 SYS   DBMS_APPLICATION_INFO  Table/Procedure/Type    Null None

25 MDSYS   GETMDSYSEVENT      Table/Procedure/Type    Null None

25 SYS   DBMS_LOCK      Table/Procedure/Type    Null None

25 SYS   DATABASE          18            Null None

74 SYS   DATABASE          18            Null None

19 rows selected.

---會(huì)話25

執(zhí)行存儲(chǔ)過程

SQL> exec proc_t_test;

---會(huì)話74

正在執(zhí)行存儲(chǔ)過程期間刪除存儲(chǔ)過程

卡住

SQL> drop procedure proc_t_test;

SQL> select session_id,owner,name,type,mode_held,mode_requested from dba_ddl_locks where session_id in (25,74) and mode_held='Exclusive' or mode_requested='Exclusive'

SESSION_ID OWNER  NAME     TYPE  MODE_HELD MODE_REQU

---------- ------------------------------ -------------------------------------------------- -------------------- --------- ---------

74 SYSTEM  PROC_T_TEST     Table/Procedure/Type Exclusive None

SQL> /

SESSION_ID OWNER  NAME     TYPE          MODE_HELD  MODE_REQU

---------- ------------------------------ -------------------------------------------------- -------------------- 

25 SYSTEM  PROC_T_TEST     Table/Procedure/Type   Null  None  持鎖會(huì)話(持鎖模式為null)

74 SYSTEM  PROC_T_TEST     Table/Procedure/Type   Exclusive None  等待會(huì)話 (請求持鎖模式為排它模式)

SQL> select distinct type from dba_ddl_locks;

TYPE

--------------------

73

Table/Procedure/Type

18

10

Body

23

6 rows selected.

---可見產(chǎn)生ddl鎖,不會(huì)體現(xiàn)在v$lock中

SQL> select sid,type,id1,id2,lmode,request from v$lock where sid in (25,74);

    SID TY     ID1 ID2 LMODE  REQUEST

---------- -- ---------- ---------- ---------- ----------

74 AE     133  0     4 0

25 AE     133  0     4 0

--可見產(chǎn)生ddl鎖,持ddl鎖的會(huì)話等待事件為library cache pin

    SID STATUS   BLOCKING_SESSION EVENT

---------- -------- ---------------- ----------------------------------------------------------------

25 ACTIVE              PL/SQL lock timer

74 ACTIVE  25          library cache pin

--等待事件對應(yīng)如下的library cache pin,library cache pin對sga的library cache內(nèi)存數(shù)據(jù)結(jié)構(gòu)的一種保存機(jī)制

SQL> col type for a50

SQL> col name for a35

SQL> col id1_tag for a30

SQL> col id2_tag for a30

SQL> col description for a50

SQL> select type,name,id1_tag,id2_tag,is_user,description from v$lock_type where lower(description) like '%library%';

TYPE   NAME       ID1_TAG    ID2_TAG              IS_ DESCRIPTION

---------- ----------------------------------- -------------------- ------------------------- --- ----------------------------------------------------------------------------------------------------

V   Library Cache Lock 3       hash value    hash value      NO  Synchronizes accesses to library cache objects

E   Library Cache Lock 2       hash value    hash value      NO  Synchronizes accesses to library cache objects

L   Library Cache Lock 1       hash value    hash value      NO  Synchronizes accesses to library cache objects

Y   Library Cache Pin 3       hash value    hash value      NO  Synchronizes accesses to the contents of library cache objects

G   Library Cache Pin 2       hash value    hash value      NO  Synchronizes accesses to the contents of library cache objects

N   Library Cache Pin 1       hash value    hash value      NO  Synchronizes accesses to the contents of library cache objects

IV   Library Cache Invalidation   object #    time stamp      NO  Synchronizes library cache object invalidations across instances

7 rows selected.

ddl鎖又分為幾種類型:

  •   排它ddl鎖

      排它DDL鎖阻止其他會(huì)話獲得DDL和DML鎖。例如刪除一個(gè)表的操作會(huì)阻止同時(shí)在表中添加一列的DDL操作,反之亦然。排它的DDL鎖在整個(gè)DDL操作時(shí)有效,執(zhí)行結(jié)束會(huì)自動(dòng)提交

  •   共享ddl鎖

      共享DDL鎖防止其它沖突的DDL操作,但是允許類似的DDL操作并發(fā)執(zhí)行。例如當(dāng)執(zhí)行DDL操作時(shí),會(huì)對引用的所有表加DDL共享鎖,其它事務(wù)可以建存儲(chǔ)過程時(shí)加共享DDL鎖,但

      是不允許加排它DDL鎖

  •   易碎解析鎖

      sql或者pl/sql會(huì)持有應(yīng)用對象的解析鎖。解析鎖被用來實(shí)現(xiàn)當(dāng)引用的對象被修改或者刪除時(shí),共享sql區(qū)域會(huì)失效。解析鎖之所以易碎,是因?yàn)樗辉试SDDL操作,當(dāng)DDL沖突

      時(shí),會(huì)被打碎

小結(jié)

   上述的ddl鎖和dml鎖不太一樣,不好理解。后續(xù)會(huì)有專門文章分享。

系統(tǒng)鎖

oracle使用系統(tǒng)鎖保護(hù)內(nèi)部的數(shù)據(jù)庫和內(nèi)存結(jié)構(gòu),用戶不能操作這些內(nèi)部鎖,它由數(shù)據(jù)庫自己控制。

系統(tǒng)鎖分為 latch,mutexes,內(nèi)部鎖internal lock

閂latch

latch是為了保護(hù)sga內(nèi)存數(shù)據(jù)結(jié)構(gòu)的一致,實(shí)現(xiàn)的一種底級鎖機(jī)制

SQL> select count(*) from v$latchname;

  COUNT(*)

----------

       902

SQL> select distinct type from v$latchname;

TYPE

----

SGA

OSP

SQL> 

SQL> select name,hash,type from v$latchname where lower(name) like '%library%';

NAME       HASH TYPE

---------------------------------------------------------------- ---------- ----

library cache load lock 2952162927 SGA          

mutex

mutex不同上于上述的latch,latch保護(hù)一組對象,而mutex更低級,它僅保護(hù)一個(gè)對象,它是代碼層面的,相當(dāng)?shù)讓?/p>

SQL> select mutex_type from v$mutex_sleep;

MUTEX_TYPE

--------------------------------

Row Cache

Library Cache

Cursor Pin

內(nèi)部鎖

它是高級別,比latch和mutex更復(fù)制,用于其它用途。數(shù)據(jù)庫具有一些類型的內(nèi)部鎖:

  • 數(shù)據(jù)字典緩存鎖

這種鎖時(shí)間短,當(dāng)數(shù)據(jù)字典實(shí)體被修改時(shí),用來保護(hù)相關(guān)內(nèi)容。這種鎖確保語句解析期間,能夠看到對象的一致性視圖。數(shù)據(jù)

字典鎖是共享和排它的。解析結(jié)束時(shí),共享鎖被釋放,DDL操作結(jié)束時(shí),排它鎖被釋放

  • 文件和日志管理鎖

這種鎖保護(hù)各種文件,例如,內(nèi)部鎖保護(hù)控制文件,確保一個(gè)時(shí)間點(diǎn)只有一個(gè)進(jìn)程能夠修改。另外的鎖能協(xié)調(diào)歸檔和在線日志。當(dāng)

多實(shí)例共享模式掛載數(shù)據(jù)庫或者單實(shí)例排它掛載時(shí)會(huì)對數(shù)據(jù)文件加鎖。由于文件鎖標(biāo)識著文件的狀態(tài),這些鎖持續(xù)的時(shí)間一般都比較長

  • 表空間和undo段鎖

用來保護(hù)表空間和undo段,例如所有實(shí)例必須對表空間是否在線達(dá)成一致

“oracle根據(jù)操作資源的類型把鎖分哪幾類”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站名稱:oracle根據(jù)操作資源的類型把鎖分哪幾類
當(dāng)前網(wǎng)址:http://muchs.cn/article40/pjjjho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)用戶體驗(yàn)、電子商務(wù)網(wǎng)站內(nèi)鏈、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司