0

Je suis face à une situation où plusieurs threads accèdent à cette méthodeservice de verrouillage et délai d'attente Tissu

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(); 
} 

filetage unique cela fonctionne bien, mais lorsque je tente d'accéder au dictionnaire ainsi à l'aide de plusieurs threads je rencontre un System.TimeOutException.

La seule façon que j'ai pu contourner est d'utiliser LockMode.Update sur la méthode GetAsync(...). Est-ce que quelqu'un ici a vécu quelque chose comme ça? Je me demande s'il y a un moyen de lire avec l'isolation de snapshots, ce qui permettrait une lecture sans verrouillage, contrairement à une lecture avec un verrou partagé sur l'enregistrement.

J'ai essayé de le faire avec une transaction partagée comme indiqué ci-dessus ainsi que des transactions individuelles pour le get et l'ensemble. Toute aide serait appréciée.

Répondre

1

Le verrou par défaut lors de la lecture est un verrou partagé. (causée par GetAsync) Si vous voulez écrire, vous avez besoin d'un verrou exclusif. Vous ne pouvez pas l'obtenir si des verrous partagés existent. Obtenir le premier verrou comme un verrou de mise à jour empêche cela, comme vous l'avez remarqué.

L'isolation des instantanés se produit lors de l'énumération des enregistrements, ce que vous ne faites pas avec GetAsync.

Plus d'infos here.