问个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,但是要将数据库作负载均衡,那成本就大了