0

私は複数のスレッドがこのメソッドにアクセスしている状況を扱っていますサービスファブリックのロックとタイムアウト

using (var tx = StateManager.CreateTransaction()) 
{ 
    var item = await reliableDictioanary.GetAsync(tx, key); 
    ... // Do work on a copy of item 
    await reliableDictioanary.SetAsync(tx, key, item); 
    await tx.CommitAsync(); 
} 
これはうまく動作しますが、私は複数のスレッドを使用して、このように辞書にアクセスしようとすると、私が遭遇

シングルスレッドSystem.TimeOutException

GetAsync(...)メソッドでLockMode.Updateを使用することができました。ここの誰かがこのような経験をしていますか?

スナップショットアイソレーションを使用して読み取る方法があると、レコードの共有ロックを使用した読み取りとは対照的に、読み取りがロックされていないことが考えられます。

私は、上記のような共有トランザクションとgetとsetの個別トランザクションの両方でこれを実行しようとしました。どんな助けもありがとう。

答えて

1

読み取り時のデフォルトのロックは共有ロックです。 (GetAsyncによって) 書き込みたい場合は、排他ロックが必要です。共有ロックが存在する場合は取得できません。

最初のロックを更新ロックとして取得すると、気付いたように、これが防止されます。

GetAsyncで実行していないレコードを列挙すると、スナップショットの分離が発生します。

詳細情報here

関連する問題