2017-04-04 3 views
0

Je rencontre un problème. Je dois stocker une liste dans la table azur. Ce que je fais est de le sérialiser à une chaîne et de le stocker. Maintenant, quand je lis cette ligne, il y a des cas où je n'ai pas eu la liste mise à jour. Par conséquent, après la lecture, si nous ajoutons un élément à la liste, l'ancien est perdu. Quelqu'un at-il déjà rencontré ce problème et quelle est la solution pour cela.Azure Table Maintenir la cohérence

Pour élaborer laisse dire que nous avons 3 classes où C étend B et B Prolonge A. maintenant un objet de B et C sont également objet de A. Maintenant, supposons que nous maintenons tout l'objet de A (y compris B et c) en tant que liste dans une colonne de la table Azure. état actuel des objets comme [A ', B', C ', A' '] Problème qui se produit lorsque nous avons plusieurs serveurs d'applications. Maintenant Server1 veut ajouter l'instance de B dans la liste en prenant la liste actuelle par exemple [A ', B', C ', A' '] ajoute une nouvelle instance laisse dire B' 'pour le rendre [A', B ', C' , A '', B ''] En même temps Server2 obtient la liste comme [A ', B', C ', A' '] et ajoute C' 'pour faire [[A', B ', C', A ''], C '']. Maintenant, les informations sur l'objet B '' sont perdues. Comment atténuer ce genre de problème.

Je suis la bibliothèque client usign dot net. Ci-dessous le code correspondant

TableOperation retrieveTypedInstancesOperation = TableOperation.Retrieve (partitionKey, RowKey); TableResult retrievedTypedInstancesResult = instancesTable.Execute (retrieveTypedInstancesOperation); Liste instanceLists = new List(); si (retrievedTypedInstancesResult.Result! = Null) {

   string instances = ((TypedInstancesRow)retrievedTypedInstancesResult.Result).Instances; 

       if (!String.IsNullOrEmpty(instances)) instanceLists = JsonConvert.DeserializeObject<List<string>>(instances); 

      } 
      instanceLists.Add(InstanceId); 

      heirarchy.PartitionKey = partitionKey; 
      heirarchy.RowKey =rowKey; 
      heirarchy.Instances = JsonConvert.SerializeObject(instanceLists); 
      TableOperation insertOperation = TableOperation.InsertOrReplace(heirarchy); 
      instancesTable.Execute(insertOperation); 
+1

Sans code, personne ne peut rien faire. – Soaku

+0

Selon votre description, nous n'avons pas pu trouver directement la raison pour laquelle la ligne n'est pas mise à jour. Pourriez-vous s'il vous plaît poster les codes de détails sur la façon dont vous mettez à jour votre liste? Quelle touche de partition et quelle touche de ligne vous avez utilisée pour télécharger votre ligne de table. Si vous pouviez poster plus d'informations, il serait plus facile pour nous de trouver la solution, –

+0

J'ai ajouté une description correcte. S'il vous plaît laissez-moi savoir si je peux fournir des informations supplémentaires. – Nishant

Répondre

0

stockage de table Azure utilise la propriété ETag pour gérer ce scénario.

Vous n'avez pas fourni votre code, donc nous ne savons pas quelle bibliothèque client vous utilisez. Donc, une réponse sommaire à votre problème est:

Si vous utilisez une opération Replace (Update), cela nécessite une valeur ETag obtenue lors de la lecture de l'enregistrement. Si la valeur ETag a changé entre la lecture d'origine et la mise à jour, la mise à jour échouera. Notez que ce comportement peut être ignoré si une valeur wilcard '*' est fournie en tant que valeur ETag pour la mise à jour.

Si vous utilisez une opération InsertOrReplace, l'enregistrement sera remplacé, quels que soient les changements entre la lecture d'origine et l'opération en cours. C'est mon hypothèse que c'est l'opération que vous utilisez.

Si vous modifiez votre code pour utiliser une opération de remplacement de votre exemple ci-dessus deviendrait:

Server 1 & 2 lire la table [A 'B', C », A ''] et l'entité retournée à les deux ont la même valeur ETag.
Le serveur 1 émet une opération de remplacement incluant l'ETag d'origine; ceci est réussi et modifie le champ en [A ', B', C ', A' ', B' '] et modifie la valeur ETag dans la table.
Le serveur 2 exécute une opération de remplacement, y compris l'ETag d'origine lu, cette opération échoue car la valeur ETag est désormais obsolète. La manière dont cet incident est géré dépend de vos besoins, mais vous devrez éventuellement informer votre utilisateur client que l'opération a échoué en raison d'une modification apportée par un autre utilisateur; relire le dernier état d'enregistrement ([A ', B', C ', A' ', B' '] avec le nouvel ETag); l'utilisateur peut alors modifier (à [A ', B', C ', A' ', B' ', C' '] comme je l'interprète est votre exigence).