2015-08-18 3 views
1

J'ai deux systèmes indépendants. À un moment donné, je voudrais être en mesure de faire une opération qui affecte les deux systèmes, et je voudrais simuler l'atomicité, même si cela est techniquement impossible. Pour illustrer le problème, disons que nous aimerions déplacer un objet d'un système à l'autre. Tout d'abord parce que chaque opération peut échouer à tout moment, j'ajoute un enregistrement provisoire au système indiquant l'intention. Le algo est:simuler un fonctionnement atomique dans des systèmes indépendants

  1. Définir l'objet dans le système 1 en mode provisoire pour supprimer
  2. Définir l'objet dans le système 2 en mode provisoire pour ajouter
  3. Déplacer l'objet du système 1 à système 2
  4. Retirez le système du expérimentalisme 2
  5. Retirez le système de expérimentalisme 1

l'absence d'opération atomique que pourrait entraîner avoir l'objet dans les deux systèmes ne sont pas en fonction de l'ordre des étapes 4 et 5, et un accident entre eux.

Ma question est, y at-il un algorithme qui pourrait en quelque sorte résoudre le manque d'atomicité et me permettre de le garantir. Je vois en quelque sorte que cela semble impossible, mais j'espère que ce n'est pas le cas.

+1

Habituellement, des opérations de ce type sont effectuées en deux phases: le gestionnaire de transactions demande aux deux systèmes s'ils sont prêts à "finaliser" une action provisoire et, après accord, envoie une commande. –

+0

Veuillez élaborer un peu sur les deux systèmes - de quoi s'agit-il? Quelle est la façon dont ils manipulent un objet en mode «provisoire»? Peut-il être vu pendant que c'est provisoire? Est-ce que cela devient «sans valeur» après un certain temps? – zmbq

+0

Les systèmes gèrent les états provisoires lorsque la poignée gracieuse du délai d'attente provisoire - les systèmes n'a pas pu terminer l'opération complète - vérifie l'état actuel des objets et restaure la présentation correcte. L'objet peut être vu, mais certains sous-ensembles d'opérations ne sont pas autorisés - en fonction de ce qui est provisoire - ils peuvent avoir des drapeaux de tentative différents activés. – gsf

Répondre

0

Assez possible (mais pas parfait). Les bases de données le font tout le temps. Voir https://en.wikipedia.org/wiki/Distributed_transaction et https://en.wikipedia.org/wiki/Two-phase_commit_protocol pour une introduction. Il s'agit, bien sûr, d'un sujet lapidaire, donc je ne peux pas fournir une petite vignette rapide en code. Mais oui, vous pouvez le faire.

Votre approche a un certain mérite. Ce dont vous avez besoin, c'est plus de communication entre les deux systèmes.

+0

Pas une mauvaise idée, @DavidEisenstat. Une base de données irait bien ici, je pense. Et oui, c'est un changement invasif. Mais a) OP a demandé si c'était possible, pas si c'était facile, et b) c'est moins onéreux que simplement prétendre que cela ne peut pas être fait. –

+0

@DavidEisenstat Nous semblons ne pas être d'accord sur ce point. –