急:多个客户端访问同一个数据库表的同步问题?

时间:2021-11-07 19:25:55
大家好,
 
 情况是这样的。  
   
  有多个客户端同时连接数据库服务器。  
   
  客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。  
   
  某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。  
   
  如何避免两个客户端同时处理一条记录(一个事件)   
   
  我担心在取的过程中,两个同时取。  
   
  大家说说有什么好办法解决。???

项目中需要用到,特别紧急,感谢大侠的帮助了。
 

8 个解决方案

#1


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

#2


 事务隔离

  悲观锁:
       select * from t where t.id = 'xx' for update;
        update ....
        commit;

 或 乐观锁,给表增加一个"版本"字段,每次对该行执行更新后要赋予"版本"新的值

#3


对于多客户端2楼的方式是不行的,因为不再同一机器上运行。
3楼的方式是一个解决办法,利用数据库事务机制实现同步机制。

#4


“有多个客户端同时连接数据库服务器。  
   
  客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。  
   
  某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。”

这个问题需要根据情况分析:
第一,如果客户端的操作都只包含一条sql语句的话,那么,不必做任何事情,因为数据库本身有并发控制的功能,它会自动处理,不需要客户操心的。
第二,如果如果客户端的操作都要包含多条语句的话,那么,把这些语句放到一个synchronized块中(或者synchronized函数)中就可以了。

#5


引用 3 楼 spiniper 的回复:
对于多客户端2楼的方式是不行的,因为不再同一机器上运行。
3楼的方式是一个解决办法,利用数据库事务机制实现同步机制。


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

如果所有客户端不是通过web,而是直接连接数据库,那确实2楼的做法行不通。

#6


引用 2 楼 pywepe 的回复:
事务隔离

  悲观锁:
  select * from t where t.id = 'xx' for update;
  update ....
  commit;

 或 乐观锁,给表增加一个"版本"字段,每次对该行执行更新后要赋予"版本"新的值


我们做的项目就是这么干的 因为我们的是c/s模式的 也就是多个客户端~~~

#7


采用数据库的事务管理机制

#8


谢谢大家的回复。
我现在采取了另外一种方式,就是服务器端创建了一个web service,然后在server端采用同步模块的取数据,分发给客户端。

至于悲观锁,我觉得不是很可取,因为万一某个客户端断线了,就会hold住整个数据库。
对于乐观锁,我曾采用了hibernate @version来指定,然后用spring管理事物,但是我模拟了多线程访问,发现getVersion返回的都是一样的,没有冲突。

所以想来想去,还是创建web service吧。简单起见,不采用Axis2,采用了CXF,巨方便。

#1


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

#2


 事务隔离

  悲观锁:
       select * from t where t.id = 'xx' for update;
        update ....
        commit;

 或 乐观锁,给表增加一个"版本"字段,每次对该行执行更新后要赋予"版本"新的值

#3


对于多客户端2楼的方式是不行的,因为不再同一机器上运行。
3楼的方式是一个解决办法,利用数据库事务机制实现同步机制。

#4


“有多个客户端同时连接数据库服务器。  
   
  客户端是用java写的,数据库是Oracle,客户端直接连接Oracle。  
   
  某个表里,存放的是一些事件,要求每个事件只能由一个客户端处理,请问如何实现。”

这个问题需要根据情况分析:
第一,如果客户端的操作都只包含一条sql语句的话,那么,不必做任何事情,因为数据库本身有并发控制的功能,它会自动处理,不需要客户操心的。
第二,如果如果客户端的操作都要包含多条语句的话,那么,把这些语句放到一个synchronized块中(或者synchronized函数)中就可以了。

#5


引用 3 楼 spiniper 的回复:
对于多客户端2楼的方式是不行的,因为不再同一机器上运行。
3楼的方式是一个解决办法,利用数据库事务机制实现同步机制。


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

如果所有客户端不是通过web,而是直接连接数据库,那确实2楼的做法行不通。

#6


引用 2 楼 pywepe 的回复:
事务隔离

  悲观锁:
  select * from t where t.id = 'xx' for update;
  update ....
  commit;

 或 乐观锁,给表增加一个"版本"字段,每次对该行执行更新后要赋予"版本"新的值


我们做的项目就是这么干的 因为我们的是c/s模式的 也就是多个客户端~~~

#7


采用数据库的事务管理机制

#8


谢谢大家的回复。
我现在采取了另外一种方式,就是服务器端创建了一个web service,然后在server端采用同步模块的取数据,分发给客户端。

至于悲观锁,我觉得不是很可取,因为万一某个客户端断线了,就会hold住整个数据库。
对于乐观锁,我曾采用了hibernate @version来指定,然后用spring管理事物,但是我模拟了多线程访问,发现getVersion返回的都是一样的,没有冲突。

所以想来想去,还是创建web service吧。简单起见,不采用Axis2,采用了CXF,巨方便。