我的代码的并发控制

时间:2014-02-17 07:49:29

标签: java multithreading hibernate concurrency

我正在处理订单捕获和生成器应用程序。对于处理不同订单的并发用户,应用程序运行良好。当来自不同系统/位置的两个用户尝试处理相同的订单时,问题就开始了。它对业务的影响是,对于相同的订单,应用程序将生成重复数据,因为两个用户同时处理该订单。

我尝试同步我生成订单的方法,但这意味着没有其他用户可以处理任何新订单,因为同步将为该方法设置锁定。当一个订单正在进行时,这肯定会阻止所有用户生成新订单,因为它会点击同步代码。

我也尝试过为订单启动标准,但没有成功。

任何人都可以建议一个正确的方法吗? 欢迎提出所有建议/意见。提前谢谢。

2 个答案:

答案 0 :(得分:0)

不是在方法级别上进行同步,而是可以对必须一次仅由一个线程操作的代码块使用块级同步。这样就可以增加同一订单的并行处理范围。

答案 1 :(得分:0)

在大规模上,如果您在数据库中备份实体,我建议您查看乐观锁定。

向订单实体添加版本字段。一旦下订单(第一次),版本为1.每次更新应按此顺序排列,因此想象两个后续并发进程

a -> Read data (version=1)
     Update data
     Store data (set version=2 if version=1)

b -> Read data (version=1)
     Update data
     Store data (set version=2 if version=1)

如果这两个处理是并发而不是序列化,您将注意到其中一个进程确实无法存储数据。这是失败的用户,他将不得不重试他的编辑。 (他在那里读取版本= 2)。

如果您使用JPA,乐观锁定就像为模型添加@Version属性一样简单。如果使用原始JDBC,则需要添加将其添加到更新条件

update table set version=2, data=xyz where orderid=x and version=1

到目前为止,这是解决您的一般问题的最佳解决方案。