2012-03-28 84 views
0

这里是情况,我有3个实例,一个是经理,分配工作,另外两个是工作人员,正在工作。让我们说,用户需要退出的东西,和工作流程就像如下:如何确保多个实例不会有数据不同步的问题?

Request sent 
Manager assign job, depends on worker instance loading 
worker do the work (reduce the num in db) 
tell the manager instance job is finished! 

所有工作上的事情,而是两个实例可以在同一帐户的两个退出,它可能有一些问题,做一个负数..所以,这里有一些问题。那么,你可以说添加一个执行通道或队列或者只执行一个数据库的写入功能的东西......

但问题是当我有越来越多的实例,只有一个写入实例,可能会减少生产力,任何建议?谢谢。

+0

您是否只有协调两次尝试访问单个帐户的问题?或者还有其他协调问题吗? (如果是这样,请保留当前正在处理的帐户表,并延迟访问表中的帐户的任何工作。) – 2012-03-28 01:50:36

回答

0

你是怎么做到的?

通过仔细设计操作为原子操作,并执行所有相关的检查,访问和更新作为原子操作的一部分。

现在你提到你有一个数据库作为实现技术的一部分。假设它是一个事务数据库,你应该将这些原子操作映射到一个事务。因此,要建立你的描述:

  1. 收到的请求
  2. 经理分配工作给工人
  3. 工人没有撤离的工作如下:
    1. 启动数据库事务
    2. 检查帐户存在。
    3. 检查withdrawal > 0
    4. 检查balance - withdrawal >= 0
    5. 更新数据库余额。
    6. 提交交易,或在出现错误时将其回滚。
  4. 工人向经理报告结果
  5. 经理响应请求。

在另一方面,如果没有数据库参与,而你只需更新内存中的对象,那么你会创建一个Account类,有一个同步的方法做一个撤军,通过做步骤3.3 3.5以上,并让工作人员调用具有相关参数的方法。

0

我建议你阅读关于synchronized块/方法或ReentrantLock。基本上你需要在你的提取函数上放置读/写锁,以确保两个线程不能同时读/写同一段数据。

相关问题