分类: Oracle
2008-04-11 10:15:01
来源:赛迪网 作者:Alice |
SESS#3:
SQL> @showlock
O_NAME SID LOCK_TYPE OBJECT_NAME XIDUSN XIDSLOT XIDSQN
---------- ----- --------------- --------------- ------ ------- ------
SCOTT 8 None EMP 0 0 0
SCOTT 7 Row Exclusive EMP 0 0 0
SQL> @showalllock
SID TY ID1 ID2 LOCK_TYPE REQUEST CTIME BLOCK
----- -- ---------- ---------- --------------- ---------- ---------- ----------
7 TM 3576 0 Row Exclusive 0 31 1
8 TM 3576 0 None 4 12 0
SESS#2申请在EMP 表上加SHARE 锁(REQUEST=4),但该申请被SESS#1阻塞,因
为SESS#1 已经在EMP 表上获得了Row Exclusive 锁,与SHARE锁不相容。
下面我们对SESS#1进行回滚后,再进行监控。
SESS#3:
SQL> @showlock
O_NAME SID LOCK_TYPE OBJECT_NAME XIDUSN XIDSLOT XIDSQN
---------- ----- --------------- --------------- ------ ------- ------
SCOTT 8 Share EMP 0 0 0
SCOTT 8 Row Exclusive DEPT 0 0 0
SQL> @showalllock
SID TY ID1 ID2 LOCK_TYPE REQUEST CTIME BLOCK
----- -- ---------- ---------- --------------- ---------- ---------- ----------
8 TM 3574 0 Row Exclusive 0 16 0
8 TM 3576 0 Share 0 16 0
SESS#2在EMP 表上获得Share锁后,又在DEPT 表上获得Row Exclusive 锁,由于没
有实际的行被修改,SESS#2 并没有获得TX 锁。
在 Oracle8中,如果子表的外键上没有加索引,当在父表上删除记录时,会先在子表上
申请获得 Share 锁,之后再在父表上申请 Row Exclusive 锁。由于表级 Share 锁的封锁粒度
较大,所以容易引起阻塞,从而造成性能问题。
当在外键上建立索引后,在父表上删除数据将不再对子表上加 Share锁,如下所示:
SESS#1:
SQL> create index i_emp_deptno on emp(deptno);
Index created.
SQL> delete dept where 0=1;
0 rows deleted.
SQL>
SQL> @showlock
O_NAME SID LOCK_TYPE OBJECT_NAME XIDUSN XIDSLOT XIDSQN
---------- ----- --------------- --------------- ------ ------- ------
SCOTT 7 Row Exclusive DEPT 0 0 0
SQL> @showalllock
SID TY ID1 ID2 LOCK_TYPE REQUEST CTIME BLOCK
----- -- ---------- ---------- --------------- ---------- ---------- ----------
7 TM 3574 0 Row Exclusive 0 9 0
可以看到,在 EMP 表 DEPTNO 列上建立索引后,在 DEPT 表上执行 DELETE 操作,
不再要求在EMP 表上加Share锁,只是在DEPT表上加 Row Exclusive锁,封锁的粒度减小,
引起阻塞的可能性也减小。
5.总结
Oracle数据库通过具有意向锁的多粒度封锁机制进行并发控制,保证数据的一致性。其 DML
锁(数据锁)分为两个层次(粒度):即表级和行级。通常的 DML 操作在表级获得的只是
意向锁(RS或RX),其真正的封锁粒度还是在行级;另外,在Oracle数据库中,单纯地读
数据(SELECT)并不加锁,这些都极大地提高了系统的并发程度。
在支持高并发度的同时,Oracle数据库利用意向锁及数据行上加锁标志位等设计技巧,减小了
Oracle维护行级锁的开销,使其在数据库并发控制方面的优势愈加明显。 |