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

杨友山
博客专家认证
2015-01-29 04:00:20
最近碰到一个问题,想把一个存储过程锁住,每次只让一个进程进去执行,上一个结束了下一个才能继续。
不过没找到合适的锁住存储过程的方法。
打算用
select s.id
into 变量
from 表 s
where
rownum=1;

试了下,貌似是达到了锁住存储过程的要求,不知道有没有什么危险。
大家帮忙看看。
...全文
459 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2015-01-29
  • 打赏
  • 举报
回复
引用 1 楼 wildwave 的回复:
这是锁存储过程,还是锁表 不过通过锁表来实现存储过程排队,倒是不错的想法 创建表s,里面只含有一条记录 存储过程执行的开头部分,锁住表s的这条记录,使得该存储过程在别的会话中执行时,会在这里等待。执行结束后,释放锁,此时下一个会话就会开始执行
嘿嘿,竟然想到的方法都是一样的,这个应该是最优的解决方法了
杨友山 2015-01-29
  • 打赏
  • 举报
回复
嗯,我打算用这个方法先试试,观测一段时间看看效果。
lyangsoft 2015-01-29
  • 打赏
  • 举报
回复
引用 2 楼 wildwave 的回复:
风险在于,如果排队增加速度大于存储过程处理的速度,就会导致严重堵塞 解决方法,一是尽量优化存储过程,使得在尽快的时间内完成,这是最根本的 二是可能的话,较少执行频率,这是业务问题 三是,在for update后加上WAIT n 限制等待的时间。当等待事件超过n秒,则返回错误。这里可以在存储过程中增加异常处理模块,来处理等待超时的情况。可以避免会话长时间卡住
小灰狼W 2015-01-29
  • 打赏
  • 举报
回复
风险在于,如果排队增加速度大于存储过程处理的速度,就会导致严重堵塞 解决方法,一是尽量优化存储过程,使得在尽快的时间内完成,这是最根本的 二是可能的话,较少执行频率,这是业务问题 三是,在for update后加上WAIT n 限制等待的时间。当等待事件超过n秒,则返回错误。这里可以在存储过程中增加异常处理模块,来处理等待超时的情况。可以避免会话长时间卡住
小灰狼W 2015-01-29
  • 打赏
  • 举报
回复
这是锁存储过程,还是锁表 不过通过锁表来实现存储过程排队,倒是不错的想法 创建表s,里面只含有一条记录 存储过程执行的开头部分,锁住表s的这条记录,使得该存储过程在别的会话中执行时,会在这里等待。执行结束后,释放锁,此时下一个会话就会开始执行

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧