日期:2014-05-17  浏览次数:20879 次

问个ORACLE的排他处理问题
偶现在维护的系统中,   排他处理的做法是,

想独占打开一条(或多条)记录时就用SELECT   ...   FOR   UPDATE   NOWAIT,   捕获到排他的异常就报个数据正在使用的错误.

现在客户希望知道具体是谁锁定了自己要使用的数据(能报出机器名或OS的用户名都行)

哪位实现过类似的功能,能否指点一下?   DB是ORACLE   10G,   用OO4O连接

--

考虑过用遍历v$locked_object的方法,   如果所有的锁都是表级别锁的话,应该可行,但现在我们系统里很多都是行级别锁,

用户A锁记录1,用户B锁记录2,用户C想编辑记录2时,v$locked_object里两条记录都满足条件,如果报出A用户在使用的话,就是冤假错案了...



------解决方案--------------------
加了nowait难。如不加nowait,从v$lock中的ID1和ID2字段,能看出具体请求的行
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具体是哪一行,以及你请求的是哪一行
------解决方案--------------------
为什么这功能不放在应用层去做呢,晕,什么都往数据层整。除非是作数据仓库的数据库系统可以有比较繁琐的计算功能,我觉得OLTP中数据库尽量只做数据存储,不然太伤害数据库服务器的性能,将这些复杂的功能都可以放在应用层,如果应用层支撑不住了,做个负载均衡就OK,但是要将数据库作负载均衡,那成本就大了