大家好,
 
 情况是这样的。  
   
  有多个客户端同时连接数据库服务器。  
   
  客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。  
   
  某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。  
   
  如何避免两个客户端同时处理一条记录(一个事件)   
   
  我担心在取的过程中,两个同时取。  
   
  大家说说有什么好办法解决。???项目中需要用到,特别紧急,感谢大侠的帮助了。
 

解决方案 »

  1.   

    我刚学j2se  线程同步里有锁定的 Synchronized
      

  2.   

     事务隔离  悲观锁:
           select * from t where t.id = 'xx' for update;
            update ....
            commit; 或 乐观锁,给表增加一个"版本"字段,每次对该行执行更新后要赋予"版本"新的值
      

  3.   

    “有多个客户端同时连接数据库服务器。  
       
      客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。  
       
      某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。”这个问题需要根据情况分析:
    第一,如果客户端的操作都只包含一条sql语句的话,那么,不必做任何事情,因为数据库本身有并发控制的功能,它会自动处理,不需要客户操心的。
    第二,如果如果客户端的操作都要包含多条语句的话,那么,把这些语句放到一个synchronized块中(或者synchronized函数)中就可以了。
      

  4.   


    如果多个客户端都通过web访问数据库,那是没有问题的,因为jsp技术中,所有的访问实际上都是在一台计算机上即服务器上执行的。如果所有客户端不是通过web,而是直接连接数据库,那确实2楼的做法行不通。
      

  5.   

    谢谢大家的回复。
    我现在采取了另外一种方式,就是服务器端创建了一个web service,然后在server端采用同步模块的取数据,分发给客户端。至于悲观锁,我觉得不是很可取,因为万一某个客户端断线了,就会hold住整个数据库。
    对于乐观锁,我曾采用了hibernate @version来指定,然后用spring管理事物,但是我模拟了多线程访问,发现getVersion返回的都是一样的,没有冲突。所以想来想去,还是创建web service吧。简单起见,不采用Axis2,采用了CXF,巨方便。