Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92547227
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: 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维护行级锁的开销,使其在数据库并发控制方面的优势愈加明显。

阅读(308) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~