自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Oracle中的DDL鎖

數(shù)據(jù)庫 Oracle
DDL鎖是Oracle數(shù)據(jù)庫中的安全防護(hù),有了DDL鎖后,數(shù)據(jù)庫中的數(shù)據(jù)安全得到了保障,所以DDL鎖是很重要的,下面就為大家詳細(xì)介紹DDL鎖。

導(dǎo)讀:當(dāng)我們發(fā)出DDL命令時(shí),會(huì)自動(dòng)在被處理的對(duì)象上添加DDL鎖定,從而防止對(duì)象被其他用戶所修改。當(dāng)DDL命令結(jié)束以后,則釋放DDL鎖定。我們不能顯式地請(qǐng)求一個(gè)DDL鎖定,只有當(dāng)對(duì)象結(jié)構(gòu)被修改或者被引用時(shí),才會(huì)在對(duì)象上添加DDL鎖定。比如創(chuàng)建或者編譯存儲(chǔ)過程時(shí)會(huì)對(duì)引用的對(duì)象添加DDL鎖定。在創(chuàng)建視圖時(shí),也會(huì)對(duì)引用的表添加DDL鎖定等。

  在執(zhí)行DDL命令之前,Oracle會(huì)自動(dòng)添加一個(gè)隱式提交命令,然后執(zhí)行具體的DDL命令,在DDL命令執(zhí)行結(jié)束之后,還會(huì)自動(dòng)添加一個(gè)隱式提交命令。實(shí)際上,Oracle在執(zhí)行DDL命令時(shí),都會(huì)將其轉(zhuǎn)換為對(duì)數(shù)據(jù)字典表的DML操作。比如我們發(fā)出創(chuàng)建表的DDL命令時(shí),Oracle會(huì)將表的名稱插入數(shù)據(jù)字典表tab$里,同時(shí)將表里的列名以及列的類型插入col$表里等。因此,在DDL命令中需要添加隱式的提交命令,從而提交那些對(duì)數(shù)據(jù)字典表的DML操作。即使DDL命令失敗,它也會(huì)發(fā)出提交命令。

  我們來看下面的例子,啟動(dòng)兩個(gè)session,其中一個(gè)叫做sess #1,另一個(gè)叫做sess #2。在sess #1里發(fā)出如下的SQL語句:

SQL> insert into t values(1);
  1 row created.

  然后在sess #2里查詢表T里的數(shù)據(jù):

SQL> select * from t;
  no rows selected

  顯然,由于sess #1還沒有提交,因此sess #2里不能檢索出sess #1所插入的記錄。接下來,我們?cè)趕ess #1里執(zhí)行下面的語句:

SQL> create table t(c1 number);
  create table t(c1 number)
  *
  ERROR at line 1:
  ORA-00955: name is already used by an existing object

  由于表T已經(jīng)存在,因此創(chuàng)建表T的命令失敗。這時(shí)我們?cè)倩氐絪ess #2里查詢表T:

SQL> select * from t;
  ID
  ----------
  1

  很明顯,我們并沒有在sess #1里發(fā)出commit命令,但這時(shí)sess #1里所作的插入操作已經(jīng)被提交了。這個(gè)commit就是通過create table這個(gè)DDL命令隱式發(fā)出的,盡管create table命令已經(jīng)失敗了。

  DDL鎖定具有以下三種類型:

  1、 排他的DDL鎖定(Exclusive DDL Lock)

  大部分的DDL操作都會(huì)在被操作的對(duì)象上添加排他的DDL鎖定,從而防止在DDL命令執(zhí)行期間,對(duì)象被其他用戶所修改。當(dāng)對(duì)象上添加了排他的DDL鎖定以后,該對(duì)象上不能再添加任何其他的DDL鎖定。如果是對(duì)表進(jìn)行DDL命令,則其他進(jìn)程也不能修改表里的數(shù)據(jù)。

  2、共享的DDL鎖定(Shared DDL Lock)

  用來保護(hù)被DDL的對(duì)象不被其他用戶進(jìn)程所更新,但是允許其他進(jìn)程在對(duì)象上添加共享的DDL鎖定。如果是對(duì)表進(jìn)行DDL命令,則其他進(jìn)程可以同時(shí)修改表里的數(shù)據(jù)。比如我們發(fā)出create view命令創(chuàng)建視圖時(shí),在視圖的所引用的表(這種表也叫基表)上添加的就是共享的DDL命令。也就是說,在創(chuàng)建視圖時(shí),其他用戶不能修改基表的結(jié)構(gòu),但是可以更新基表里的數(shù)據(jù)。

  3、可打破的解析鎖定(Breakable Parsed Lock)

  在shared pool里緩存的SQL游標(biāo)或者PL/SQL程序代碼都會(huì)獲得引用對(duì)象上的解析鎖定。如果我們發(fā)出DDL命令修改了某個(gè)對(duì)象的結(jié)構(gòu)時(shí),該對(duì)象相關(guān)的、位于shared pool里的解析鎖定就被打破,從而導(dǎo)致引用了該對(duì)象的SQL游標(biāo)或者PL/SQL程序代碼全都失效。下次再次執(zhí)行相同的SQL語句時(shí),需要重新解析,這也就是所謂的SQL語句的reload了。可打破的解析鎖定不會(huì)阻止其他的DDL鎖定,如果發(fā)生與解析鎖定相沖突的DDL鎖定,則解析鎖定也會(huì)被打破。

  我們主要通過dba_ddl_locks視圖來監(jiān)控DDL鎖定,沒有與DDL鎖定相關(guān)的V$視圖。如果沒有發(fā)現(xiàn)dba_ddl_locks視圖,則執(zhí)行腳本$ORACLE_HOME/rdbms/admin/catblock.sql來創(chuàng)建該視圖,執(zhí)行腳本時(shí)應(yīng)該以用戶sys的身份登錄數(shù)據(jù)庫。

上文中介紹到的Oracle中的DDL鎖使Oracle數(shù)據(jù)庫中的數(shù)據(jù)安全得到了保障,避免數(shù)據(jù)庫中數(shù)據(jù)的丟失或者被人亂改。

【編輯推薦】

  1. Oracle安全全接觸
  2. Oracle安全數(shù)據(jù)系統(tǒng)架構(gòu)全接觸
  3. 對(duì)Oracle安全性的建設(shè)的建議
責(zé)任編輯:迎迎 來源: 中國(guó)IT實(shí)驗(yàn)室
相關(guān)推薦

2010-04-16 17:35:39

Oracle進(jìn)程

2011-04-11 17:10:16

Oracle

2010-04-16 14:39:54

ORACLE鎖

2010-04-16 14:55:12

ORACLE鎖

2010-04-29 09:52:27

Oracle鎖

2010-04-26 10:09:22

Oracle存儲(chǔ)過程

2010-04-19 09:52:24

Oracle行級(jí)鎖

2010-04-16 14:27:37

Oracle鎖表

2010-04-19 10:35:04

Oracle進(jìn)程

2010-05-06 17:54:54

Oracle鎖

2022-02-20 21:35:43

MySQLDDL阻塞

2009-11-17 17:02:01

Oracle鎖存器

2011-08-18 13:44:42

Oracle悲觀鎖樂觀鎖

2010-10-27 16:27:18

Oracle查詢

2010-04-14 11:42:36

Oracle進(jìn)程

2020-01-16 14:59:32

Java鎖優(yōu)化CAS

2011-08-09 16:15:23

OracleDDL語句DML語句

2023-06-12 09:09:19

MySQLDDLNSTANT

2010-04-15 13:10:09

Oracle系統(tǒng)結(jié)構(gòu)

2024-03-18 12:21:28

Java輕量級(jí)鎖重量級(jí)鎖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)