当前位置: 代码迷 >> Oracle开发 >> oracle顶用for update锁存储过程有什么风险
  详细解决方案

oracle顶用for update锁存储过程有什么风险

热度:61   发布时间:2016-04-24 06:29:54.0
oracle中用for update锁存储过程有什么风险
最近碰到一个问题,想把一个存储过程锁住,每次只让一个进程进去执行,上一个结束了下一个才能继续。
不过没找到合适的锁住存储过程的方法。
打算用
select s.id
into 变量
from 表 s
where
rownum=1;

试了下,貌似是达到了锁住存储过程的要求,不知道有没有什么危险。
大家帮忙看看。
------解决思路----------------------
这是锁存储过程,还是锁表

不过通过锁表来实现存储过程排队,倒是不错的想法

创建表s,里面只含有一条记录
存储过程执行的开头部分,锁住表s的这条记录,使得该存储过程在别的会话中执行时,会在这里等待。执行结束后,释放锁,此时下一个会话就会开始执行
------解决思路----------------------
引用:
风险在于,如果排队增加速度大于存储过程处理的速度,就会导致严重堵塞

解决方法,一是尽量优化存储过程,使得在尽快的时间内完成,这是最根本的
二是可能的话,较少执行频率,这是业务问题
三是,在for update后加上WAIT n 限制等待的时间。当等待事件超过n秒,则返回错误。这里可以在存储过程中增加异常处理模块,来处理等待超时的情况。可以避免会话长时间卡住

------解决思路----------------------
引用:
这是锁存储过程,还是锁表

不过通过锁表来实现存储过程排队,倒是不错的想法

创建表s,里面只含有一条记录
存储过程执行的开头部分,锁住表s的这条记录,使得该存储过程在别的会话中执行时,会在这里等待。执行结束后,释放锁,此时下一个会话就会开始执行


嘿嘿,竟然想到的方法都是一样的,这个应该是最优的解决方法了
  相关解决方案