如何获得特定的锁?

How to acquire a particular lock?

如何获取更新排他锁?文章 states“用户可以请求更新锁而不是共享锁”,但我没有找到指定锁类型的方法。

目前我有一本存储列表的字典。我的目标是:当有人只阅读列表时 — 让我们拍一张快照,不要阻止其他人。当有人要修改列表时 — 让我们采用独占锁或更新锁(老实说我找不到区别),其他人应该在事务提交之前等待,甚至读取都不应该.

我无法理解的细节是:如果意图只是读取,如何指定允许读取集合,以及意图是读取然后写入(我们无法更改以其他方式存在的数据),则此事务应等待所有锁,然后才能成功读取和修改集合。

有一个名为 LockMode 的枚举,您可以将其传递给可靠词典和队列上的某些方法,从而允许您指定所需的功能。 Afaik,唯一支持它的方法是字典上的 TryGetValue 和 ContainsKey 以及队列上的 TryPeek。我自己也被那篇文章弄糊涂了,因为我最初被引导相信我可以在每笔交易中指定它(顺便说一句,这会很棒)。目前,您使用 LockMode 的选项非常有限。

这就是我解决同时阅读和写作问题的方法。

更新锁没有像我预期的那样工作,它总是需要独占锁,如果你要更新一个相同的项目,此时不可能对集合执行任何其他操作(包括只读)关键。

但是可以使读取操作无锁——您只需要从辅助副本读取即可。当然在那种情况下你可能得不到实际数据,但总比没有和 TimeoutException 好。

尽管如此,同时写入同一个项目还是很慢的,如果你想更新数据,即使有 TimeoutException,你也需要仔细考虑重试策略。