下面我们对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维护行级锁的开销,使其在数据库并发控制方面的优势愈加明显。
【责任编辑:
碧海蓝天 TEL:(010)68476606】