是否检测到couchbase中的锁释放?

是否检测到couchbase中的锁释放?,couchbase,Couchbase,以下是我想做的: try to lock a few documents if any lock fails: unlock any docs we've locked so far wait until all locks are cleared retry from beginning do something 然而,我不知道如何有效地等待,直到所有锁都被清除。我在couchbase文档中找不到任何东西,除了使用一个“无限”循环来检查锁定尝试是否返回临时失败错误。有没有什么好方

以下是我想做的:

try to lock a few documents
if any lock fails:
  unlock any docs we've locked so far
  wait until all locks are cleared
  retry from beginning
do something
然而,我不知道如何有效地等待,直到所有锁都被清除。我在couchbase文档中找不到任何东西,除了使用一个“无限”循环来检查锁定尝试是否返回临时失败错误。有没有什么好方法可以在重试之前等待正确的时间?(加上一些随机时间以避免重复冲突)

在重试之前等待15秒以上并不是真正的用户友好。

没有直接的用户友好

不过,两种可能的优化可能会使它更高效

一个是,在应用程序级别,你可以有一个方案,如果你无法获得锁,你可以在该锁上与服务员保持一个记录,因此只有最顶层的一两个人试图获得锁


第二,您可能应该使用指数退避重试来有效地重试锁。如果你真的想变得复杂,你可以在锁最有可能可用的时候围绕负指数构建和训练一个模型。随着“截止日期”的临近,您会更频繁地进行投票,而这一点的数学描述为负指数函数。

如果多台服务器竞相锁定某些文档,但它们都失败了,那么使用指数递减的等待时间是一个非常糟糕的主意。如果两者同时尝试,我们会一次又一次地遇到相同的问题。除非它们以相同的顺序锁定,否则它们永远不会在完全相同的时间。一个会成功,其他人必须等待。是的,但如果他们不按相同的顺序锁定。它们可以分别锁定“许多”文档,只有少数文档被两个线程锁定。当他们锁定相同的文档时,他们不必执行相同的任务。事实上,如果不能使用相同的顺序,它会变得更加复杂。Couchbase中超时的锁无法为您解决此问题。有许多关于死锁检测和回退等方面的优秀出版物适用于这里。一般来说,大多数人试图重构问题以避免这种复杂性。这是经常发生的,但并不总是可能的。我猜按字典顺序锁定键可以解决这个问题。