ORACLE LOCK
锁(lock),用于管理对共享资源的并发访问。
Oracle主要有3种锁类型:
l DML Lock:用于保护数据上的锁
l DDL Lock:用于保护结构对象的定义
l 内部锁和闩:用于保护oracle内部数据结构
介绍Oracle锁机制前,先介绍共享锁和排他锁:
共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
排他锁:如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
DML Lock(DML锁)
1. TX锁(事务锁)
事务中开始第一个修改时会得到TX锁,而且一直会持续的拥有这个TX锁,直到事务发生COMMIT或者ROLLBACK。
获得锁信息:
SELECT username, v$lock.sid, trunc(id1/power(2,16)) rbs, bitand(id1,to_number('ffff','xxxx'))+0 slot, id2 seq, lmode, request FROM v$lock, v$session WHERE v$lock.type = 'TX' AND v$lock.sid = v$session.sid AND v$session.username = 'SCOTT'; / USERNAME SID RBS SLOT SEQ lmode REQUEST ---------- ----- ---------- ---------- ---------- --------- ---------- SCOTT 52 9 1 433787 6 0
SELECT XIDUSN, XIDSLOT, XIDSQN FROM v$transaction; / XIDUSN XIDSLOT XIDSQN ---------- ---------- ---------- 9 1 433787 |
其中,LMODE为锁类型,REQUEST值为0指无其他事务请求,用有此锁,RBS、SLOT和SEQ值与V$TRANSACTION信息匹配,组成事务ID。
LMODE
0,'None(0)',
1,'Null(1)',
2,'Row Share(2)',
3,'Row Exclu(3)',
4,'Share(4)',
5,'Share Row Ex(5)',
6,'Exclusive(6)')
REQUEST
0,'None(0)',
1,'Null(1)',
2,'Row Share(2)',
3,'Row Exclu(3)',
4,'Share(4)',
5,'Share Row Ex(5)',
6,'Exclusive(6)')
2. TM锁(DML enqueue)
TM Lock为了保证对象在修改内容时,对象的结构不会发生改变。
例:
sys@ORCL> drop table scott.dept; drop table scott.dept * ERROR at line 1: ORA-00054: resource busy and acquire with NOWAIT specified |
DDL Lock
在DDL操作中会自动为对象加DDL锁(DDL Lock),从而保护这些对象不会被其他会话所修改。
内部锁(闩)
闩(latch)是轻量级的串行化设备,用于协调对共享数据结构、对象和文件的多用户访问。属于Oracle的内部锁。