一个类似于车票预订冲突的经典问题,请教高手如何解决。

shi_hang_nk 2010-06-02 02:35:07
这是一个类似于车票预订冲突的经典问题。

我正在开发一个人工复核图片的应用,功能是从一个Oracle的表中读出待复核的图片记录,人工复核后将结果填回记录中。

现在的难点是该系统有30个操作人员,如何处理并发问题?如操作员A读出一条记录开始处理,操作员B就不能再读出了。

我现在的解决方案是设标志位,待复核记录的初始状态是“未复核”,操作员A读出一条记录时系统给该记录设上“正在复核”的标志位,复核完毕时系统给记录设“复核完成”的标志位。操作员B在读取记录时系统只返回状态为“未复核”的记录。这样存在的问题是要起一个进程来定期清理长期处于“正在复核”状态的记录(如操作不当等原因引起),将它们改回“未复核”。

请问从数据库层面有没有什么机制可以解决这个问题呢?比如采用什么锁机制,当操作员A读出记录时操作员B就看不到,同时还能保证清理状态位。
...全文
131 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
codearts 2010-06-02
  • 打赏
  • 举报
回复
select 。。。from 。。。 for update skip locked rows;
xwizardx 2010-06-02
  • 打赏
  • 举报
回复
MARK一下啊
etsilence 2010-06-02
  • 打赏
  • 举报
回复
建议你看看TOM的9i 10g编程艺术,里面就有这个典型案例的解决办法和优劣比较,网上大把大把的下载。
半世码农 2010-06-02
  • 打赏
  • 举报
回复
学习了[Quote=引用 3 楼 kingkingzhu 的回复:]

每次取出之前 先执行
select 。。。from 。。。 for update nowait
即可以判断数据是否被加锁,又可以锁定数据
[/Quote]
kingkingzhu 2010-06-02
  • 打赏
  • 举报
回复
每次取出之前 先执行
select 。。。from 。。。 for update nowait
即可以判断数据是否被加锁,又可以锁定数据
半世码农 2010-06-02
  • 打赏
  • 举报
回复
遇到过同样的问题!看高手是怎么解决的
zmercury 2010-06-02
  • 打赏
  • 举报
回复
读取数据时 用for update 读取 就其他用户只能读不能更改了

17,078

社区成员

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

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