oracle+update+阻塞,insert,update和delete造成阻塞的示例-Oracle

insert,update和delete造成阻塞的示例

1.update 产生锁示例:  www.2cto.com

session 1:

SQL> drop table t purge;

SQL> create table t(id int primary key);

Table created.

SQL> select sid from v$mystat where rownum=1;

SID

———-

854

SQL> insert into t values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> update t set id=2 where id=1; –更新未提交

1 row updated.

session 2:

SQL> select sid from v$mystat where rownum=1;

SID

———-

834

SQL> update t set id=3 where id=1; –此时更新同条记录时SQL产生等待

session 3:

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where sid in (834,854) order by 1,2;

SID TY        ID1        ID2      LMODE    REQUEST      BLOCK

———- — ———- ———- ———- ———- ———-

834 TM      91874          0          3          0          0

834 TX     655407    1648480          0          6          0

854 TM      91874          0          3          0          0

854 TX     655407    1648480          6          0          1

SQL> select sid,event from v$session_wait where sid in (834,854);

SID EVENT

———- —————————————————————-

834 enq: TX – row lock contention

854 SQL*Net message from client

说明:

这里sid=854是session1,sid=834是session2;

TM是一个表级锁(段锁),表示此表的记录在修改时,不允许对表进行DDL操作;

TX是一个行级锁(事务锁),表示不允许对表修改的记录进行DML操作;

当TY=TM and ID2=0时,ID1的值为此表(段)的object_id;

当TY=TX and ID2<>0时,ID1+ID2构成了这个事务在回滚段中的位置;

LMODE=3表示一个表级共享锁,LMODE=6行级的排他锁(最高模式的锁);

REQUEST=6 表示当前会话正待等待一个LMODE=6 的锁,表明这个会话正在被阻塞;

block=1是表示这个会话正在阻塞其它会话;

2.delete 产生锁示例:

session 1:

SQL> select * from t;

ID

———-

1

SQL> delete from t where id=1; –删除SQL未提交

1 row deleted.

session 2:

SQL> delete from t where id=1; –此时删除同条记录时SQL产生等待

session 3:

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where sid in (834,854) order by 1,2;

SID TY        ID1        ID2      LMODE    REQUEST      BLOCK

———- — ———- ———- ———- ———- ———-

834 TM      91874          0          3          0          0

834 TX     655364    1648669          0          6          0

854 TM      91874          0          3          0          0

854 TX     655364    1648669          6          0          1

SQL> select sid,event from v$session_wait where sid in (834,854);

SID EVENT

———- —————————————————————-

834 enq: TX – row lock contention

854 SQL*Net message from client

说明:

同update一样

3.insert 产生锁示例:

session 1:

SQL> drop table t purge;

SQL> create table t(id int primary key);

Table created.

SQL> insert into t values(1); –插入未提交

1 row created.

session 2:

SQL> insert into t values(1); –此时插入有同样主键记录时SQL产生等待

session 3:

SQL> select sid,type,id1,id2,lmode,request,block from v$lock where sid in (834,854) order by 1,2;

SID TY        ID1        ID2      LMODE    REQUEST      BLOCK

———- — ———- ———- ———- ———- ———-

834 TM      91874          0          3          0          0

834 TX     262174     192335          6          0          0

834 TX     458776     193901          0          4          0

854 TM      91874          0          3          0          0

854 TX     458776     193901          6          0          1

SQL> select sid,event from v$session_wait where sid in (834,854);

SID EVENT

———- —————————————————————-

834 enq: TX – row lock contention

854 SQL*Net message from client

说明:

这里和update产生锁的情况不一样的是,会话2在持有一个LMODE=6的排他锁和等待一个LMODE=4的锁。

因插入的并不是同一条记录,会话2插入时的记录没被阻塞,而是对表的数据块头修改的阻塞,所以会话在请求一个LMODE=4的锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值