如何确保多个实例不会有数据不同步问题?

时间:2012-03-28 01:45:42

标签: java multithreading multiple-instances

这是情况,我有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!

所有事情都有效,但是两个实例可能有两个在同一个帐户中退出,可能有一些问题,要做一个负数....所以,它有一些问题。好吧,你可以说添加一个执行通道或队列或只执行一个数据库的写函数....

但问题是,当我有越来越多的实例,只有一个实例用于编写时,可能会降低生产力,任何建议?感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你是怎么做到的?

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

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

  1. 收到请求
  2. 经理为工人分配工作
  3. 工人的退出工作如下:
    1. 启动数据库事务
    2. 检查该帐户是否存在。
    3. 检查withdrawal > 0
    4. 检查balance - withdrawal >= 0
    5. 更新数据库余额。
    6. 提交交易,或在有错误的情况下回滚交易。
  4. 工作人员向经理报告结果
  5. 经理回应请求。
  6. 另一方面,如果没有涉及数据库,并且您只是更新内存中的对象,那么您将创建一个Account类,该类具有执行撤消的同步方法,执行步骤3.3通过上述3.5,让工人用相关参数调用方法。