Oracle的锁
上一篇 / 下一篇 2008-07-08 16:37:20 / 个人分类:Oracle管理
参考资料:《Oracle 9i&10g编程艺术》
锁的类型:
DML锁:通常在SELECT、INSERT、UPDATE、MERGE和DELETE语句中出现,DML锁允许并发执行数据修改,只在特定数据行上锁。
DDL锁:通常在CREATE和ALTER语句中出现,DDL锁可以保护对象结构定义。
内部锁和latches:Oracle使用这些锁来保护其内部数据结构。(本文不介绍)
- DML锁
用于确保一次只有一个人能修改某一行,而且正在处理的一个表不能被删除。
1.TX锁(事务锁)
事务中修改数据时会得到TX锁,且会一直持有这个锁,直至事务执行提交或回滚,TX锁一种排队机制的资源。
SQL> update dept set deptno = deptno+10;
4 rows updated.
SQL> select username,
2 v$lock.sid,
3 trunc(id1/power(2,16)) rbs,
4 bitand(id1,to_number('ffff','xxxx'))+0 slot,
5 id2 seq,
6 lmode,
7 request
8 from v$lock, v$session
9 where v$lock.type = 'TX'
10 and v$lock.sid = v$session.sid
11 and v$session.username = USER;
USERNAME SID RBS SLOT SEQ LMODE REQUEST
-------- ---------- ---------- ---------- ---------- ---------- ----------
TEST 158 4 4 2082 6 0
SQL> select XIDUSN, XIDSLOT, XIDSQN from v$transaction;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
4 4 2082
2.TM锁
TM锁用于确保在修改表中的数据时,表的结构不会改变。
session1:
SQL> update dept set deptno = deptno+10;
4 rows updated.
session2:
SQL> drop table dept;
drop table dept
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
- DDL锁
在DDL操作中会自动为对象加DDL锁,从而保护这些对象不会被其他会话所修改。
有3种类型的DDL锁:
1.排他DDL锁
阻止其他会话得到它们自己的DDL锁或TM锁。
Alter table t add new_column date;
2.共享DDL锁
保护所引用对象的结构,使之不会被其他会话修改,但是允许修改数据。
create index t_idx on t(x) ONLINE;
另外一类DDL会获得共享DDL锁。在创建存储的编译对象(如过程和视图)时,对依赖的对象加这种共享DDL锁。
例如,如果执行以下语句:
Create view MyView as select * from emp, dept where emp.deptno = dept.deptno;
CREATE VIEW命令处理过程中,表EMP和DEPT上都会加共享DDL锁,可以修改这些表的数据,但是不能修改它们的结构。
3.可中断解析锁(breakable parse lock)
这个锁允许一个对象向另外的对象注册其依赖性。
会话解析一条语句时,对于该语句引用的每一个对象都会加可中解析锁。这个锁的目的是:如果以某种方式删除或修改了一个被引用的对象,可以将共享池中已解析的缓存语句置为无效。
DBA_DDL_LOCKS视图,可查看共享池中锁定的对象
SQL> create or replace procedure p as begin null; end;
2 /
Procedure created.
SQL> exec p;
PL/SQL procedure successfully completed.
SQL> select session_id sid,owner,name,type,mode_held held,mode_requested request from dba_ddl_locks;
SID OWNER NAME TYPE HELD REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
162 SYS SCHEDULER$_INSTANCE_S Table/Procedure/Type Null None
161 SYS ALERT_QUE_R 23 Null None
161 SYS ALERT_QUE_R 23 Null None
161 SYS DBMS_HA_ALERTS_PRVT Table/Procedure/Type Null None
161 SYS DBMS_RCVMAN Table/Procedure/Type Null None
161 SYS DBMS_APPLICATION_INFO Body Null None
161 SYS AQ$_ALERT_QT_E 10 Null None
161 SYS DBMS_RCVMAN Body Null None
161 SYS STANDARD Body Null None
161 SYS DBMS_BACKUP_RESTORE Body Null None
161 SYS DBMS_APPLICATION_INFO Table/Procedure/Type Null None
SID OWNER NAME TYPE HELD REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
161 SYS DBMS_PRVT_TRACE Body Null None
161 SYS STANDARD Table/Procedure/Type Null None
161 SYS PLITBLM Table/Procedure/Type Null None
161 SYS PLITBLM Table/Procedure/Type Null None
161 SYS DBMS_PRVT_TRACE Table/Procedure/Type Null None
161 SYS DBMS_HA_ALERTS_PRVT Body Null None
158 SYS DBMS_APPLICATION_INFO Body Null None
158 SCOTT SCOTT 18 Null None
158 SYS DATABASE 18 Null None
158 SCOTT P Table/Procedure/Type Null None
145 SYS DATABASE 18 Null None
SID OWNER NAME TYPE HELD REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
158 SYS DBMS_APPLICATION_INFO Table/Procedure/Type Null None
161 SYS DBMS_BACKUP_RESTORE Table/Procedure/Type Null None
这里可看到过程P在视图中出现。
SQL> alter procedure p compile;
Procedure altered.
SQL> select session_id sid,owner,name,type,mode_held held,mode_requested request from dba_ddl_locks;
SID OWNER NAME TYPE HELD REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
162 SYS SCHEDULER$_INSTANCE_S Table/Procedure/Type Null None
161 SYS ALERT_QUE_R 23 Null None
161 SYS ALERT_QUE_R 23 Null None
161 SYS DBMS_HA_ALERTS_PRVT Table/Procedure/Type Null None
161 SYS DBMS_RCVMAN Table/Procedure/Type Null None
161 SYS DBMS_APPLICATION_INFO Body Null None
161 SYS AQ$_ALERT_QT_E 10 Null None
161 SYS DBMS_RCVMAN Body Null None
161 SYS STANDARD Body Null None
161 SYS DBMS_BACKUP_RESTORE Body Null None
161 SYS DBMS_APPLICATION_INFO Table/Procedure/Type Null None
SID OWNER NAME TYPE HELD REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
161 SYS DBMS_PRVT_TRACE Body Null None
161 SYS STANDARD Table/Procedure/Type Null None
161 SYS PLITBLM Table/Procedure/Type Null None
161 SYS PLITBLM Table/Procedure/Type Null None
161 SYS DBMS_PRVT_TRACE Table/Procedure/Type Null None
161 SYS DBMS_HA_ALERTS_PRVT Body Null None
158 SYS DBMS_APPLICATION_INFO Body Null None
158 SCOTT SCOTT 18 Null None
158 SYS DATABASE 18 Null None
145 SYS DATABASE 18 Null None
158 SYS DBMS_APPLICATION_INFO Table/Procedure/Type Null None
SID OWNER NAME TYPE HELD REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
161 SYS DBMS_BACKUP_RESTORE Table/Procedure/Type Null None
重新编译过程P后,它从DBA_DDL_LOCKS视图中消失,说明解析锁被中断了。
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG:

