偶现在维护的系统中, 排他处理的做法是,想独占打开一条(或多条)记录时就用SELECT ... FOR UPDATE NOWAIT, 捕获到排他的异常就报个数据正在使用的错误.现在客户希望知道具体是谁锁定了自己要使用的数据(能报出机器名或OS的用户名都行)哪位实现过类似的功能,能否指点一下? DB是ORACLE 10G, 用OO4O连接--考虑过用遍历v$locked_object的方法, 如果所有的锁都是表级别锁的话,应该可行,但现在我们系统里很多都是行级别锁,用户A锁记录1,用户B锁记录2,用户C想编辑记录2时,v$locked_object里两条记录都满足条件,如果报出A用户在使用的话,就是冤假错案了...
1 07000001DD305AC8 07000001DD305AE8 132 TX 1441799 66062 0 6 79 0
2 07000001E0E7CD30 07000001E0E7CEA8 340 TX 2228256 40737 6 0 289 0
3 07000001DEF8EB00 07000001DEF8EC78 547 TX 1441799 66062 6 0 382 1
如132和547请求是同一行,所以132被阻塞了,但加了nowait后,实际上看不到这个信息了。
除非知道1441799 66062具体是哪一行,以及你请求的是哪一行
这系统里现在都是用的NOWAIT,这招估计行不通了...我越来越发觉这是个不可能的任务了,除非象返回执行SQL的ERRCODE一样,有一个直接就能返回来的跟LOCK相关的信息,否则估计很难了...
http://www.orafaq.com/maillist/oracle-l/2001/02/01/0185.htm既然没法准确定位, 只能把当前系统中所有跟当前SQL相关的锁定信息以列表形式显示出来,让客户自己猜去吧...此贴再挂几天,周末结了...