我正在处理订单捕获和生成器应用程序。对于处理不同订单的并发用户,应用程序运行良好。当来自不同系统/位置的两个用户尝试处理相同的订单时,问题就开始了。它对业务的影响是,对于相同的订单,应用程序将生成重复数据,因为两个用户同时处理该订单。
我尝试同步我生成订单的方法,但这意味着没有其他用户可以处理任何新订单,因为同步将为该方法设置锁定。当一个订单正在进行时,这肯定会阻止所有用户生成新订单,因为它会点击同步代码。
我也尝试过为订单启动标准,但没有成功。
任何人都可以建议一个正确的方法吗? 欢迎提出所有建议/意见。提前谢谢。
答案 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
到目前为止,这是解决您的一般问题的最佳解决方案。