一个关于LOCK的问题

[复制链接]
查看11 | 回复9 | 2011-2-18 11:43:34 | 显示全部楼层 |阅读模式
系统中有一个关键任务一直没有运行完,我对这个session作trace,发现它用select *** from *** for update of***nowait 时由于resource busy,一直重复执行这个sql直到锁定数据。由于这个sql执行时间很短,系统中没有锁等待,这种情况下,怎样查处是哪个事务/session堵塞这句sql?
系统中在这个sql查询的表上有TM锁的有很多session,怎样找出堵塞它的那一个?
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
dba_waiters
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
select * from v$lock where block=1 试试
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
最初由 eof007 发布
[B]系统中有一个关键任务一直没有运行完,我对这个session作trace,发现它用select *** from *** for update of***nowait 时由于resource busy,一直重复执行这个sql直到锁定数据。由于这个sql执行时间很短,系统中没有锁等待,这种情况下,怎样查处是哪个事务/session堵塞这句sql?
系统中在这个sql查询的表上有TM锁的有很多session,怎样找出堵塞它的那一个? [/B]

参考一下我的blog中的这篇文章:
http://qiuyb.itpub.net/post/8049/61654
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
最初由 xiaohou 发布
[B]dba_waiters [/B]

oracle9i中是不存在的
SQL> desc dba_waiters
ERROR:
ORA-04043: 对象 dba_waiters 不存在

SQL> show user
USER 为"SYS"
请问是哪个版本的?
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
看了4楼的明白了。是$ORACLE_HOME/rdbms/admin/catblock.sql 运行后才有的。
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
堵塞时间很短,sleep时间较长,来不及看就过去了。察看视图,很难看到锁。sql由于busy马上返回。程序是一个PRO*C程序。没源码。
sql_trace中没有lock信息。
能对session的锁情况进行跟踪吗?
另外,能对ora-54 resource busy 设event跟踪吗?要能跟踪,语法是怎样的?跟踪文件中有lock信息吗?
谢谢大家。
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
手工执行select *** from *** for update (不要后面的notwait)
然后查看谁block了这个session
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
可通过被锁的对象查询锁他的session.
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
这个sql是绑定了9个变量的。一一代进去非常麻烦。
select *** from *** for update of *** nowait 常常会造成lock问题,我碰到好几回。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行