2010-12-13 72 views
1

Comment dois-je gérer un événement oùComment gérer la base de données Concurrency

  1. utilisateur A est l'édition d'un Doc
  2. utilisateur B lance l'édition du même Doc
  3. utilisateur B Saves
  4. utilisateur A Sauvetages - Devrait échouer mais que dois-je gérer? Dire à l'utilisateur que la page (ou l'entité) a été enregistrée par quelqu'un d'autre ne semble pas suffisant. L'utilisateur doit savoir quelle partie du document/des champs a été modifiée et déterminer s'il souhaite réessayer la sauvegarde ou non.
    • Si ses champs juste courts, je pense que je peux les comparer - quel est un moyen efficace de comparer & nouvelles valeurs dans un domaine?
    • Si c'est un document texte long, comment puis-je faire quelque chose comme un diff? Ou alors comment dois-je gérer cela? Juste dire à l'utilisateur que quelqu'un a sauvegardé le document après l'avoir ouvert ne semble pas suffisant?

Répondre

1

Dans la plupart des applications, il s'avère que est assez pour simplement dire à l'utilisateur que la sauvegarde a échoué en raison d'un autre utilisateur mettant à jour les mêmes données. Cela s'appelle optimistic concurrency: essentiellement, vous supposez qu'aucun conflit ne se produira, et vous gérez la situation où un conflit se produit en rejetant simplement une seconde opération d'écriture sur les mêmes données.

Tout ce qui va au-delà est la programmation personnalisée. Votre suggestion d'offrir un diff est spécifique à votre domaine. S'il s'agit de modifier des documents texte, vous pouvez utiliser des documents diff standard. Avant d'emprunter cette route, demandez-vous si cela vaut la peine de passer beaucoup de temps sur ...

0

Notez que pour la langue que vous voulez cela, mais en Java j'utilise xstream pour sérialiser l'objet en XML puis diff les XMLs utilisant http://www.crosswire.org/jsword/java2html/org.crosswire.common.diff.index.html pour voir ce qui a changé.

Si vous n'avez que quelques entités et cas d'utilisation, vous pouvez vous en sortir en implémentant tout ce comportement manuellement et utiliser uniquement le moteur diff pour comparer les gros blobs du texte.