2016-08-23 8 views
1

更新、排他ロックを取得するにはどうすればよいですか?第statesでは、「共有ロックの代わりにユーザーが更新ロックを要求できますが、ロックの種類を指定する方法が見つかりませんでした。特定のロックを取得する方法は?

現在、私はリストを格納する辞書を持っています。私の目標は、誰かがリストを読むだけなので、スナップショットを撮り、他の誰もブロックしないようにしましょう。誰かがリストを変更しようとしているときに、排他的ロックまたはおそらく更新ロックを取って(正直に私は違いを見つけることはできません)、他の人はトランザクションがコミットする前に待つべきです。でも読み取ることはできません。

私が理解していない詳細は、意図が読み込みのみであれば、コレクションの読み込みを許可し、読み込みと書き込みを行うことを指定する方法です(既存のデータは別の方法で)、このトランザクションはすべてのロックを待機し、コレクションを正常に読み取って変更する必要があります。

+0

シナリオで[ConcurrentDictionary](https://msdn.microsoft.com/en-us/library/dd997369(v = vs.110).aspx)を使用できますか? –

+0

@AndrewMorton、いいえ、ConcurentDictionaryは分散システムには適していません。信頼できるコレクションが適切であったとしても、私はロックとトランザクションを使って物事を把握したいと考えています。 – cassandrad

答えて

2

信頼性の高い辞書やキューのいくつかのメソッドに渡して、必要な機能を指定できるようにするLockModeという列挙型があります。それをサポートする唯一の方法は、辞書のTryGetValueとContainsKeyとキューのTryPeekです。私は当初、この記事で混乱していました。当初はトランザクションごとに指定できると信じていました(これはすばらしいでしょう)。現時点では、LockModeを使用したオプションは限られています。

+0

SFのロックの詳細https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-reliable-collections-transactions-locks –

1

これは、私が読書と書くことで同時に問題を解決した方法です。

アップデートロックが期待どおりに機能しないため、常に排他ロックを行います。同じキーのアイテムを更新する場合は、この時点でコレクションに他の操作(読書のみを含む)を実行することはできません。

しかし、読み取り操作をロックフリーにすることができます。セカンダリレプリカから読み取るだけで済みます。もちろん、その場合は実際のデータを取得することはできませんが、何もTimeoutExceptionよりも優れています。

同じ項目への同時書き込みはかなり遅く、TimeoutExceptionでもデータを更新したい場合は、再試行ポリシーについて慎重に考える必要があります。

+0

スナップショットの隔離はどうですか?セカンダリからそれを読んでいるとデータの矛盾が起こる可能性があると思います。 – sotn

関連する問題