这是一个类似于车票预订冲突的经典问题。我正在开发一个人工复核图片的应用,功能是从一个Oracle的表中读出待复核的图片记录,人工复核后将结果填回记录中。现在的难点是该系统有30个操作人员,如何处理并发问题?如操作员A读出一条记录开始处理,操作员B就不能再读出了。我现在的解决方案是设标志位,待复核记录的初始状态是“未复核”,操作员A读出一条记录时系统给该记录设上“正在复核”的标志位,复核完毕时系统给记录设“复核完成”的标志位。操作员B在读取记录时系统只返回状态为“未复核”的记录。这样存在的问题是要起一个进程来定期清理长期处于“正在复核”状态的记录(如操作不当等原因引起),将它们改回“未复核”。请问从数据库层面有没有什么机制可以解决这个问题呢?比如采用什么锁机制,当操作员A读出记录时操作员B就看不到,同时还能保证清理状态位。

解决方案 »

  1.   

    读取数据时 用for update 读取  就其他用户只能读不能更改了 
      

  2.   

    每次取出之前 先执行
    select from  for update nowait
    即可以判断数据是否被加锁,又可以锁定数据
      

  3.   

    建议你看看TOM的9i 10g编程艺术,里面就有这个典型案例的解决办法和优劣比较,网上大把大把的下载。
      

  4.   

    select from  for update skip locked rows;