久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

共計(jì) 8461 個(gè)字符,預(yù)計(jì)需要花費(fèi) 22 分鐘才能閱讀完成。

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

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

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

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

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

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

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

dml 鎖

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

例如: 一個(gè) DML 鎖可以防止兩個(gè)用戶(hù)在在線(xiàn)商店購(gòu)買(mǎi)最后一本書(shū)。DML 語(yǔ)句自動(dòng)獲取如下類(lèi)型的鎖:行級(jí)鎖 TX 和表鎖 TM

示例

    SQL update t_test set a=1;

    2 rows updated.

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

SQL /

    SID TY
    ID1
LMODE
 REQUEST

———- — ———- ———- ———- ———-

25 AE
    133
 0
    4
0

25 TX
  65566      1359
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
    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ù)庫(kù)使用隊(duì)列機(jī)制獲取行級(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ù)庫(kù)會(huì)使用 ITL 中原來(lái)事務(wù)的 ID,通過(guò)查詢(xún)相關(guān)動(dòng)態(tài)視圖判斷事務(wù)是否還存在,及鎖是否存在,如果鎖仍然是活動(dòng)的,那么會(huì)話(huà)排隊(duì)等待事務(wù)結(jié)束后的通知,如果鎖不活動(dòng)了,那么,事務(wù)得到鎖,并更新 ITL 表

小結(jié)

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

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

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

   oracle 會(huì)話(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 種不同的鎖模式,之前文章講過(guò),不再?gòu)?fù)述

ddl 鎖

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

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

小結(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 類(lèi)似的語(yǔ)句

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

    ddl 鎖由 oracle 自身控制,人為無(wú)法控制,無(wú)法顯式獲取 ddl 鎖

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

    ddl 鎖底層是通過(guò)鎖定數(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)

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

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

SESSION_ID OWNER
    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è)測(cè)試會(huì)話(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ì)話(huà) 25

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

SQL exec proc_t_test;

— 會(huì)話(huà) 74

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

卡住

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ì)話(huà)(持鎖模式為 null)

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

SQL select distinct type from dba_ddl_locks;

TYPE

——————–

73

Table/Procedure/Type

18

10

Body

23

6 rows selected.

— 可見(jiàn)產(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
LMODE
 REQUEST

———- — ———- ———- ———- ———-

74 AE
    133
 0
    4
0

25 AE
    133
 0
    4
0

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

    SID STATUS   BLOCKING_SESSION EVENT

———- ——– —————- —————————————————————-

25 ACTIVE
             PL/SQL lock timer

74 ACTIVE
 25          library cache pin

– 等待事件對(duì)應(yīng)如下的 library cache pin,library cache pin 對(duì) 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 鎖又分為幾種類(lèi)型:

  排它 ddl 鎖

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

  共享 ddl 鎖

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

      是不允許加排它 DDL 鎖

  易碎解析鎖

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

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

小結(jié)

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

系統(tǒng)鎖

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

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

閂 latch

latch 是為了保護(hù) sga 內(nèi)存數(shù)據(jù)結(jié)構(gòu)的一致,實(shí)現(xiàn)的一種底級(jí)鎖機(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ù)一組對(duì)象,而 mutex 更低級(jí),它僅保護(hù)一個(gè)對(duì)象,它是代碼層面的,相當(dāng)?shù)讓?

SQL select mutex_type from v$mutex_sleep;

MUTEX_TYPE

——————————–

Row Cache

Library Cache

Cursor Pin

內(nèi)部鎖

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

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

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

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

文件和日志管理鎖

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

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

表空間和 undo 段鎖

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

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

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-26發(fā)表,共計(jì)8461字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 正定县| 泰和县| 怀来县| 老河口市| 浦县| 长岛县| 荆门市| 登封市| 尚志市| 小金县| 景泰县| 阿拉尔市| 隆林| 龙川县| 左云县| 兴仁县| 乐平市| 旅游| 双牌县| 石楼县| 揭东县| 南投县| 安溪县| 陈巴尔虎旗| 壶关县| 吉安县| 洛阳市| 建湖县| 红原县| 定结县| 金平| 德昌县| 宣汉县| 繁峙县| 安庆市| 新民市| 鲁甸县| 云阳县| 韶关市| 绍兴市| 南宫市|