Je suis à la recherche dans le NoSQL pour une mise à l'échelle des solutions de rechange à une base de données. Que dois-je faire si je veux des transactions en fonction des choses qui sont sensibles à ce genre de choses?
Réponses
Trop de publicités?En règle générale, les solutions NoSQL ont un poids plus léger sémantique transactionnelle de bases de données relationnelles, mais ont encore des équipements pour les opérations atomiques à un certain niveau.
Généralement, ceux qui n'maître-maître de réplication de fournir moins dans la voie de la cohérence, et plus de disponibilité. Il faut donc choisir le bon outil pour le bon problème.
Beaucoup offrent des opérations sur le document unique (ou en rangée, etc.) niveau. Par exemple avec MongoDB il est l'atomicité du document unique - mais les documents peuvent être assez riche donc, cela fonctionne généralement assez bien -- plus d'infos ici.
C'est le plus proche de la réponse que j'ai trouvé qui s'appliquerait à toutes les bases de données NoSQL. C'est sur une 2007 blog de Adam Wiggins de Heroku.com:
L'ancien exemple d'utilisation d'une transaction de base de données pour envelopper le transfert d'argent d'un compte bancaire à un autre est total bull. La bonne solution est de stocker une liste de livre événements (les transferts entre comptes) et de montrer que l'équilibre actuel comme une somme de la comptabilité. Si vous êtes à la programmation dans un langage fonctionnel (ou penser de cette façon), c'est évident.
De: http://adam.heroku.com/past/2007/12/17/a_world_without_sql/ (Son site est idéal pour des idées sur l'évolutivité.)
J'ai interprété le paragraphe ci-dessus:
- Créer une base de données sur les comptes des membres.
- Créer une file d'attente de messagerie. Le surnom de "grand livre".
- Ajouter dans le fond de travailleurs pour répondre à chaque demande dans la file d'attente.
Plus d'info. sur les files d'attente/d'arrière-plan pour les travailleurs: http://adam.heroku.com/past/2009/4/14/building_a_queuebacked_feed_reader_part_1/
Le client (aka membre ou client) suit ces étapes pour sortir de l'argent:
- Soumettre une demande à sortir de l'argent.
- La demande est envoyée au serveur.
- Serveur de la place dans une file d'attente. Le message est: "sortez de 5 000$."
- Le Client est indiqué: "Veuillez attendre que la demande est remplie..."
- Les machines Client sondages serveur toutes les 2 secondes à se demander "A la demande d'été accompli?"
- Sur le serveur, le fond, les travailleurs sont l'accomplissement de précédentes demandes d'autres membres des premières-in/first-out de la mode. Finalement, ils arrivent à votre demande du client à sortir de l'argent.
- Une fois que la demande a été remplies, le client reçoit un message avec leur nouvel équilibre.
Vous pouvez utiliser Heroku.com pour créer une petite maquette rapidement si vous êtes à l'aise avec Node.js ou Ruby/Rack.
L'idée générale semble assez facile et beaucoup mieux que d'utiliser les transactions cuits dans la base de données qui font qu'il est super dur à l'échelle.
Avertissement: je n'ai pas mis en œuvre de quelque manière que ce soit encore. J'ai lu au sujet de ces choses pour la curiosité, même si je n'ai aucun besoin pratique pour eux. Oui, @gbn est juste qu'un SGBDR avec des transactions serait probablement suffisant pour les besoins de Timmy et moi. Néanmoins, il serait amusant de voir jusqu'où vous pouvez prendre des bases de données NoSQL avec des outils open-source et un site web appelé, "Une Tornade de Razorblades".
NoSQL couvre un large ensemble d'outils et de services, y compris la clé-valeur, document, graphique et large colonne de magasins. Ils sont en général l'amélioration de l'évolutivité de la banque de données, généralement par la distribution de traitement des données. Les attendus de l'ACIDE propriétés relationnelles DBs (définition correcte des transactions trop) restreint la façon dont l'évolutivité peut être amélioré: Nous avons à choisir entre abandonner l'évolutivité, de la cohérence ou de la tolérance de pannes -- et la plupart de ces outils de donner de la cohérence et donc l'ACIDE.
Un exemple fréquemment cité le théorème le théorème CAP: la cohérence, la disponibilité et la partition de la tolérance ne peut pas être réalisée à la même époque. SQL, NoSQL et NewSQL outils peuvent être classés en fonction de ce qu'ils donnent; un bon cas de figure peut être trouvé ici.
Un nouveau, de l'affaiblissement de définir des exigences de remplacement de l'ACIDE est de la BASE ("fondamentalement avalilable, doux état, la cohérence des résultats"). Cependant, finalement cohérente d'outils ("par la suite, tous les accès à un élément sera de retour la dernière mise à jour de la valeur") sont difficilement acceptables dans les applications transactionnelles des services comme la banque. Ici, une bonne idée serait d'utiliser de la mémoire, orientée sur la colonne et distribué SQL/ACIDE bases de données, par exemple VoltDB; je suggère de regarder ces "NewSQL" des solutions.
Je voulais juste faire remarquer à l'argent de la transaction des conseils sur ce fil. Les Transactions sont quelque chose que vous voulez vraiment utiliser avec les transferts d'argent.
L'exemple donné comment faire que les transferts est très agréable et bien rangé.
Mais dans la vraie vie, le transfert d'argent peut inclure les frais ou paiements à d'autres comptes. Les gens obtenir des bonus pour l'utilisation de certaines cartes qui viennent d'un autre compte ou ils peuvent obtenir les frais pris à leur compte à un autre compte dans un même système. Les commissions ou rémunérations peuvent varier en fonction des transactions financières et vous devrez peut-être tenir la comptabilité un système de crédit et de débit de chaque transaction comme elle vient.
Cela signifie que vous souhaitez mettre à jour plusieurs lignes en même temps depuis de crédit sur un compte de débit sur un ou plusieurs comptes. La première permet de verrouiller les lignes de sorte que rien ne peut changer avant la mise à jour puis vous assurez-vous que les données écrites est conforme à la transaction.
C'est pourquoi vous voulez vraiment utiliser les transactions. Si quelque chose ne va pas écrit une ligne, vous pouvez reprendre des tas de mises à jour sans l'aide financière de données de transaction de fin incohérente.
Supposons que vous souhaitez mettre à jour 2 documents, et vous voulez être sûr que les deux mises à jour sont engagés, ou les deux mises à jour échouent. Vous pouvez jamais être absolument sûr de ce que, comme vous le pouvez avec un SGBDR Transaction? Je ne le pense pas.
Par exemple, dans CouchDB, avec la réplication et de la concurrence optimiste, comment pouvez-vous être sûr que toute mise à jour ne va pas devenir "conflit" quelque temps plus tard? Vous ne pouvez pas! Donc, par conséquent, vous ne pouvez jamais être sûr que les 2 mises à jour à la fois "être engagé" ( si ce terme s'applique même? )
Je ne sais pas quelle est la réponse à ce type de problème, mais je suis sûr qu'il doit s'agir de penser différemment de ce que nous sommes habitués avec les SGBDR transactions. Je suppose que toutes les données mises à jour qui doivent absolument être atomique, doit également être contenue dans un document unique, parce que c'est la seule atomicité que vous avez!
C'est un sujet intéressant. Quelqu'un d'autre a de l'expérience relative (automatiquement) la mise à jour de 2 ou plusieurs documents dans un NoSQL db?