实验环境:
OS: win2003
DB: oracle 10.2.0.1
实验目的:
为何 delete 操作产生的锁等待模式为6,insert操作产生的锁等待模式为 4
实验步骤:
delete 操作
session 1
SQL> select distinct sid from v$mystat;
SID
----------
130
SQL> select * from tt;
ID
----------
1
2
然后删除一行数据
SQL> delete from tt where id=1;
已删除 1 行。
此时在session 2中删除同一行数据,该会话 hang住
session 2
SQL> select distinct sid from v$mystat;
SID
----------
116
SQL> select * from tt;
ID
----------
1
2
然后再打开另外一个新的会话 session 3,做如下查询
SQL> selectsid,type,id1,id2,lmode ,request,ctime,block from v$lock where sid in(130,116);
SID TYID1ID2LMODEREQUESTCTIMEBLOCK
---------- -- ---------- ---------- ---------- ---------- ---------- ----------
116 TX 262155950
0
6 69
0
130 TM56645
0
3
0 86
0
116 TM56645
0
3
0 69
0
130 TX 262155950
6
0 86
1
从中可以看到delete操作跟 update操作一样,由于session 130和116删除同一行数据,因此先获得资源的 130会话正在
阻塞 116 会话,这个结果也可以从 等待事件中得到验证
SQL>
SID EVENT
---------- --------------------------------------------------------------
116 enq: TX - row lock contention
130 SQL*Net message from client
insert 操作
在模拟 insert 操作的时候,需要在tt表的id字段加约束,否则不会形成阻塞的情况
在 session 1中
SQL> create table tt(id int primary key);
表已创建。
SQL> insert into tt values(1);
已创建 1 行。
SQL> insert into tt values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from tt;
ID
----------
1
2
然后再插入一条数据,不提交
SQL> insert into tt values(3);
已创建 1 行。
此时在 session 2中插入相同一条数据,发现session 2 被hang住
SQL> select distinct sid from v$mystat;
SID
----------
116
SQL> insert into tt values(3);
重新打开一个新的会话窗口 session 3,做如下查询
SQL> selectsid,type,id1,id2,lmode ,request,ctime,block from v$lock where sid in(130,116) order by sid,type;
SID TYID1ID2LMODEREQUESTCTIMEBLOCK
---------- -- ---------- ---------- ---------- ---------- ---------- ----------
116 TM56648
0
3
0648
0
116 TX 589824 1013
6
0648
0
116 TX 393241955
0
4648
0
130 TM56648
0
3
0675
0
130 TX 393241955
6
0675
1
从结果可以看到,会话130和116 同时 insert 两条相同的记录违反了主键约束,因而产生了阻塞。
会话 116 被 会话130阻塞,且正在请求模式为 4 (S)的锁,这种锁比update、delete、select for update
的锁级别要小。模式越小,锁的级别越小。
疑问:
为何delete操作的时候,每个session 只有一个表锁 TM 和一个事务锁 TX,
而insert 操作的时候,每个session 除了一个TX、一个TM锁以外,为何被阻塞的会话 116 还要请求一个 4 (共享锁 )?
|