Frage

würde ich es nicht wagen, ohne Transaktionen in einer Datenbank etwas komplexer zu machen. Es gibt fast immer ein einfaches in-built-Befehl zu verwenden. Aber wenn Sie mit anderen persistenten Daten zu arbeiten beginnen Sie einfach nicht bekommen diese einfache Transaktionsunterstützung zu verwenden. Einige Beispiele sind

  • Dateisysteme
  • Web-Service (keine, die ich verwendet habe)

Auch in nicht-persistenten Daten ist es oft nützlich, um einen Block von Arbeit rückgängig zu machen, eine Ausnahme folgen. Keiner der Standarddatenstrukturen erhalten Sie mit einer Sprache, die Unterstützung Transaktionen.

Was ich möchte wissen, ist, warum Datenbanken der Sonderfall sind?

Gibt es nützliche Links rund um das Thema Transaktionsverhalten out-Seite von Datenbanken?

War es hilfreich?

Lösung

Ich muss respektvoll widersprechen: Transaktionssysteme sind nicht automatisch und ausschließlich Datenbank-Engines, ganz im Gegenteil ...

Ich habe einen Antrag Transaktionsmechanismus (in .NET) implementiert, die aus einer Datenbank-Transaktion unterscheiden. Es ist eigentlich ziemlich einfach (ein paar Stunden Arbeit, die eine Unit-Test-Suite). Es ist vollständig in C # ohne Abhängigkeiten von jeder Datenbank-Funktionalität oder einer anderen Komponente geschrieben. Aber zuerst einige Kontext ...

Diese Nicht-Datenbank-Transaktion Funktion existiert in mehreren Manifestationen auf der Java-Plattform, wie mit EJBs, ESBs, JMS, und oft in Verbindung mit BPM. Einige dieser Erscheinungen verwenden, um eine zugrunde liegende Datenbank, aber nicht immer und nicht aus Notwendigkeit. Andere Plattformen haben vergleichbare Erscheinungen, wie MSMQ.

Die meisten Legacy-Versionskontrollsysteme keine ACID Transaktionssemantik implementieren. Wie ddaa sagte CVS nicht aber Subversion (Nachfolge) der Fall ist. Visual Source Safe nicht. Wenn Sie Subversion Forschung, können Sie Vergleichstabellen finden, die einen Punkt daraus machen.

Jetzt für den kritischen Punkt, eine Datenbanktransaktion oder dessen Äquivalent bietet keine Garantie für sichere Geschäftslogik. Obwohl ich Subversion lieben, ist es ironischerweise ein gutes Beispiel für diese Tatsache.

Sie können die Subversion religiös verwenden, zusammen mit einem automatisierten Build-Skript (ein Befehl, der, Tests und Pakete Ihre Anwendung kompiliert), und noch ein gebrochenes Build zum Quellcodeverwaltungsrepository begehen. Ich habe es immer wieder gesehen. Natürlich ist es noch einfacher, mit nicht-ACID-transaktionsbasierte Source-Control-Tools wie VSS. Aber es ist schockierend für viele Menschen zu erfahren, dass es mit Tools wie Subversion möglich ist.

Lassen Sie mich das Szenario zu legen, bitte. Sie und ein Mitarbeiter entwickeln eine Anwendung, und mit Subversion für die Quellcodeverwaltungsrepository. Sie sind beide Codierung weg und hin und wieder in das Repository zu begehen. Sie ein paar Änderungen vornehmen, einen bereinigter Build (neu kompilieren alle Quelldateien) laufen, und alle Tests bestanden. Also, Sie Ihre Änderungen und nach Hause gehen. Ihr Kollege hat seine eigenen Änderungen gearbeitet, so läuft er auch einen bereinigter Build, sieht alle Tests bestehen, und verpflichtet sich, das Repository. Aber Ihr Kollege aktualisiert dann aus dem Repository, macht ein paar Änderungen, läuft eine saubere bauen, und die Build bläst in sein Gesicht! Er kehrt seine Änderungen, Updates aus dem Repository wieder (nur um sicher zu sein), und stellt fest, dass ein bereinigter Build noch explodiert! Ihre Mitarbeiter verbringt die nächsten paar Stunden Fehlerbehebung für den Aufbau und die Quelle, und schließlich findet eine Änderung, die Sie gemacht, bevor Sie, dass links die Build-Fehler verursacht. Er feuert eine böse E-Mail an Dich ab, und Ihrem gegenseitigen Chef, beklagte, dass Sie die Build brachen und dann nach Hause achtlos gingen. Sie kommen am Morgen Ihre Mitarbeiter und Ihr Chef wartet auf Ihrem Schreibtisch zu finden, die Sie fluchen, und alle anderen zu beobachten! So schnell Sie einen bereinigter Build laufen und ihnen zeigen, dass der Bau nicht kaputt ist (alle Tests bestanden, so wie letzte Nacht).

Also, wie ist das möglich? Es ist möglich, weil jeder Entwickler-Workstation nicht Teil der ACID-Transaktion ist; Subversion garantiert nur den Inhalt des Repository. Wenn Ihre Mitarbeiter aus dem Repository aktualisiert, enthielt sein Arbeitsplatz eine gemischte Kopie des Inhalts des Repositorys (einschließlich Änderungen) und seine eigenen unbestätigten Änderungen. Wenn Ihre Mitarbeiter einen bereinigter Build auf seinem Arbeitsplatz lief, wurde er eine geschäftliche Transaktion aufruft, die nicht von ACID-Semantik geschützt wurde. Als er seine Änderungen rückgängig gemacht und führte ein Update, abgestimmt sein Arbeitsplatz dann das Repository aber die Build wurde immer noch brach. Warum? Da die Workstation auch Teil einer separaten Geschäftstransaktion war, die auch nicht durch ACID-Semantik geschützt wurde, im Gegensatz zu Ihrem in das Repository zu begehen. Da Sie Ihre Workstation nicht aktualisiert hatte Sie das Repository übereinstimmen vor dem Ausführenr bereinigter Build, das Sie nicht wirklich bauen die Quelldateien, wie sie im Repository vorhanden waren. Wenn Sie eine solche Aktualisierung durchgeführt, würden Sie dann feststellen, dass der Build auch auf der Workstation ausfällt.

Jetzt kann ich auf meinem ersten Punkt auslegen - Transaktionen Umfang / Kontext, die sorgfältig in Betracht gezogen werden muß. Nur weil Sie eine ACID-Transaktion haben bedeutet nicht, dass Ihre Geschäftslogik sicher ist, sofern der Umfang / Kontext der ACID-Transaktion und die Business-Logik stimmt genau überein. Wenn Sie auf irgendein Form von Datenbank ACID-Transaktion setzen, aber Sie tun, was in Ihrer Business-Logik, die nicht von dieser Datenbank Transaktion abgedeckt ist, dann haben Sie eine Lücke, die ein vergleichbaren und katastrophale Fehler erlauben kann. Wenn Sie Ihre Geschäftslogik zwingen können genau Ihre Datenbank Transaktion übereinstimmen, dann ist alles gut. Wenn nicht, dann müssen Sie wahrscheinlich eine separate Geschäftstransaktion. Je nach Art der ungeschützten Logik, müssen Sie Ihren eigenen Transaktionsmechanismus implementieren.

So kann Messaging sein Transaktions-, aber der Umfang ist nur die Nachricht. In Bezug auf das obige Beispiel ist Subversion Zusammenhang mit dem Repository nur ein Individuum begehen. Allerdings ist die Geschäftstransaktion ein bereinigter Build, die einen viel größeren Umfang beinhaltet. Dieses besondere Problem wird in der Regel durch Skripting einen bereinigter Build zusammen mit einem sauberen Kasse gelöst, idealerweise eine kontinuierliche Integration Implementierung unter Verwendung (beispielsweise über CruiseControl- oder dergleichen). Auf dem Entwickler-Workstations, erfordert es jeden Entwickler, die Disziplin zu üben eine vollständige Aktualisierung (oder sogar eine saubere Kasse) vor einem sauberen Build auszuführen.

Also, zu rekapitulieren, hat jede Transaktion einen Rahmen oder Kontext, der seinen Schutz begrenzt. Geschäftstransaktionen übernehmen oft eine Logik, die den Umfang der Transaktionsmechanismen (wie ein Datenbank-Engine) übersteigt, die wir häufig verwenden. Sie könnten den Unterschied ausmachen müssen. In seltenen Fällen könnte es sogar sinnvoll sein, Ihren eigenen Transaktionsmechanismus zu schreiben, dies zu tun.

architected ich ein Umschreiben eines kritischen Business-System für eine bescheidene neunzig Personen-Unternehmen. Ich fand es notwendig, einen solchen Mechanismus zu implementieren, und ich fand die Erfahrung einfach zu sein, lohnt sich, und lohnend. Ich würde es wieder tun, vielleicht ein wenig leichter, aber ich würde immer fragen, warum ich nicht nur eine Datenbanktransaktion halten könnte.

Andere Tipps

Ich denke, dass der Grund, dass Geschäfte nur in Datenbanken zu sehen ist, dass per definitionem der Systeme, die Transaktionen zur Verfügung stellen werden als Datenbanken. Das klingt rund, also muss ich auszuarbeiten.

Transaktionsunterstützung ist die Funktion, die ACID Eigenschaften. In Laien ausgedrückt bedeutet, dass eine Transaktion ist etwas, das 1. Bündel eine Anzahl von diskreten Operationen in einem Paket ermöglicht es, die entweder als Ganzes erfolgreich ist oder nicht als Ganzes 2. verstecken unbestätigten Änderungen an gleichzeitigen Benutzern, so dass 3. gleichzeitige Benutzer haben zu jeder Zeit eine „konsequente“ Ansicht des Systems.

Dateisysteme traditionell einig Verriegelungsmechanismus bieten, aber dies unterscheidet sich von Transaktionen bietet. Allerdings werden alle Dateisysteme haben einige Atomeigenschaften. wenn Sie Verzeichnisse /a/ und /b/ Zum Beispiel haben, und Sie gleichzeitig versuchen mv /a /b/a und mv /b /a/b auszuführen, nur einer dieser Operation wird erfolgreich sein, ohne Integrität zu gefährden. Welche Dateisysteme im Allgemeinen fehlt, jedoch ist die Fähigkeit, mehrere Operationen in einem isolierten Atom Bündel zu bündeln.

Eine Antwort Subversion erwähnt. Alle sane Versionskontrollsysteme haben Transaktionen. Wenn Sie mehrere Dateien zu begehen, das System entweder applie begehen die vollständig oder lehnt sie vollständig (mit Ausnahme von CVS, dass ich nicht als gesund betrachten). Die Ursache für die Ablehnung ist immer eine gleichzeitige Änderung. Versionskontrollsystem Implementierer ist sehr bewusst eine Datenbank aufrecht zu erhalten.

Eine weitere Antwort erwähnt Messaging-Systeme wie transaktionale . Ich habe das verknüpfte Material nicht lesen, aber die Antwort selbst erwähnte nur Atom-Zustellung von Nachrichten. Das ist keine Transaktionen.

Ich habe nie von Clojure vor Brian C. es hier erwähnt. Es scheint mir, es ist in der Tat eine Implementierung von Transaktionen außerhalb des Kontexts einer Datenbank. Hier liegt der Schwerpunkt Concurrency Control, anstatt Konsistenz von dauerhaften Daten beibehalten wird.

Also, mit Ausnahme von Clojure, scheint es, dass jedes System, das Transaktionen verwendet entweder eine zugrunde liegende Datenbank benötigt, oder drehen sich in eine Datenbank.

Moderne Dateisysteme Transaktionen zu tun haben. Sie sind nur transparent für die Endbenutzer.

NTFS, XFS, JFS, EXT3 und ReiserFS alles tun, um nur einige zu nennen.

Und das ist nur innerhalb des Dateisystems. Viele OSes auch das Sperren von Dateien (siehe Herd (2) in der * NICHTS Welt, zum Beispiel) mit exklusivem (Schreiben) und Shared (lesen) Sperren unterstützen.

Edit: Wenn man darüber nachdenkt, Dateisysteme nicht Isolationsstufen wie moderne DBs haben, denn sobald Sie eine Datei gelesen haben, Sie traditionell schließen Sie es, wenn Sie es nicht sperren haben. Dann sind Sie es wieder öffnen, wenn Sie es schreiben wollen.

Clojure verwendet Software Transactional Memory , die Transaktionen verwendet, um es einfach und sicher ohne manuelle Schlösser Multi-threaded-Programme zu schreiben. Clojure hat unveränderliche Datenstrukturen mit veränderlichem Verweis auf sie und Transaktionen erforderlich sind, um die Verweise zu ändern.

Messaging-Systeme sind ein weiteres Beispiel für Transaktionsressourcenmanager.

Das heißt, können Sie sicherstellen, dass eine Nachricht Verbraucher erfolgreich eine Nachricht aus der Warteschlange verarbeitet. Wenn die Verarbeitung fehlschlägt, dann wird die Nachricht in der Warteschlange gelassen.

Darüber hinaus ist ein Messaging-System an einer verteilten Transaktion mit einem anderen Ressourcenmanager übernehmen kann.

Weitere Informationen unter

Subversion Commits sind Transaktions: sie wirklich atomar sind, so ein unterbrochenes begeht nicht das Repository in einem inkonsistenten Zustand

.

ich die Situation habe ich brauchte ein Dateisystem und eine Datenbank als eine Transaktionseinheit zu behandeln.

In meinem Fall musste ich nur einen Satz von Dateien in das Dateisystem zum Download bereit. Ich habe es getan, indem zufällige Verzeichnisse jedes Mal, die Daten dort setzen, und in einer Datenbanktabelle der Verzeichnisnamen zu speichern. Daher sind alle meine Datenbank arbeiten, und der Verzeichnisname in der Datenbanktabelle (= Dateisystem arbeiten), könnte in einer Datenbank-Transaktion durchgeführt werden.

http://www.databasesandlife.com/atomic-operations -über-Dateisystem-and-Datenbank /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top