繁体   English   中英

锁定对象的字段值

[英]Lock on object's field value

我的微服务正在接收来自RabbitMQ的消息并将其存储在CouchDB上,我正在创建多个使用者线程来处理它们,并且由于发生了竞争情况,因此我的代码抛出ConflictUpdateException,即

线程X,Y同时读取同一对象的bed db值; 线程X在线程Y之前更新Couch中的记录,但是线程Y在X修改的记录之前基于哈希值(_rev)更新记录。

对象的唯一标识符是复合的:name + age + id,

如何仅对具有相同(name + age + id)的线程执行关键部分?

我不想实施的可能方法:

  1. 锁定字符串值(名称+年龄+ ID)。 [不是一个好习惯]

  2. HashMap的String和CustomObjects用于锁定。 [因为我没有对唯一对象计数的限制]

有什么建议么?

我认为您应该跟踪_rev:

  • 检索文档,记下CouchDB发送的_rev属性
  • 编辑您需要的字段
  • 使用_rev属性将更新后的文档发回
  • 如果_rev与当前存储的号码匹配,请完成!
  • 如果存在冲突(当_rev不匹配时),请检索最新的文档版本,然后再次编辑需要编辑的内容。 转到步骤3

您将需要并发HashMap结构,其中包含锁定的主键。 它们的表示取决于您,不鼓励使用的字符串将与某些实现hashcode + equals的特殊类的实例一样好。 您的使用者将通过调用原子putIfAbsent()遍历试图锁定记录的输入队列。 如果成功,它将执行其storeToDatabase()调用,然后从该映射中移除()条目。 否则,移至队列中的下一个条目。

这样,您在此锁定键映射中只需要几个(使用者数量)条目,就不会占用大量内存,并且并行性级别会很高。 但是,它不会保留传入的订单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM