在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本文内容 复制代码 代码如下: SQL> select distinct sid from V$mystat; SID ---------- 118 SQL> create table t (x int primary key); 表已创建。 SQL> insert into t values(1); 已创建 1 行。 SQL> update t set x=10 where x=1; 已更新 1 行。 SQL> 先查看本次会话的 SID,然后创建一个表 t,只有一个名为 x 的字段,且该字段为主键,插入一条数据,并更新该数据。 接下来,打开另一个会话 session 2: 复制代码 代码如下: SQL> select distinct sid from V$mystat; SID ---------- 137 SQL> update t set x=10 where x=1; 此时,该会话被“卡”在这里不动。只是光标一直在闪……因为,session 2 被 session 1 阻塞。 现在,查看锁定视图 V$LOCK。 复制代码 代码如下: SQL> select sid,type,id1,id2,lmode,request,block 2 from v$lock where sid in (118,137) 3 order by sid; 已选择6行。 SQL> 说明:“TYPE”列表示锁的类型;“LMODE”列表示锁的模式;“ID1”和“ID2”列是锁的相关信息。“REQUEST”列是正在什么锁。 SID=118 是第一个会话,SID=137 是第二个会话。第三行,第一个会话 BLOCK=1 表示这个会话正在阻塞其他会话,LMODE=6 表示锁的模式,即行级排他锁。第六行,第二个会话 REQUEST=6 表示当前会话正在等待一个 LMODE=6 的锁。注意,第三行和第六行的 ID1 和 ID2 列完全相同。因为它们指向统一资源,只不过一个是资源的拥有者(SID=118),一个是资源的等待者(SID=137)。 通过这个视图,很容易发现所在——故障定位(trouble shooting)。会话 2 之所以被“卡”住,是因为会话 1 还没提交,而在这张表上,又恰好有要求列值唯一性约束。 通过 SID 号,查看视图 V$SESSION 就可以确定用户信息。 复制代码 代码如下: SQL> select machine from v$session where sid in (118,137); MACHINE ---------------------------------------------------------------- NUODE\LN NUODE\LN SQL> 因为,两个会话是同一台机器,所以名字一样。 |
请发表评论