Frage

Ich verstehe in gewisser Weise, wie normale ACID-Transaktionen funktionieren.Sie führen einige Arbeiten an einer Datenbank so aus, dass die Arbeit erst bestätigt wird, wenn eine Art Commit-Flag gesetzt wird.Der Festschreibungsteil basiert auf einer zugrunde liegenden Annahme (z. B. ist das Schreiben eines einzelnen Festplattenblocks atomar).Im Falle eines schwerwiegenden Fehlers können Sie die nicht festgeschriebenen Daten einfach in der Wiederherstellungsphase löschen.

Wie funktionieren verteilte Transaktionen?In einigen MS-Dokumentationen habe ich gelesen, dass man (unter anderem) irgendwie eine Transaktion über Datenbanken und Dateisysteme hinweg durchführen kann.

Diese Technologie könnte (und wird wahrscheinlich auch) für Installationsprogramme verwendet werden, bei denen Sie möchten, dass das Programm vollständig installiert ist oder ganz fehlt.Sie starten einfach eine Transaktion beim Start des Installationsprogramms.Als Nächstes können Sie eine Verbindung zur Registrierung und zum Dateisystem herstellen und die Änderungen vornehmen, die die Installation definieren.Wenn die Arbeit erledigt ist, führen Sie einfach einen Commit durch oder führen Sie ein Rollback durch, wenn die Installation aus irgendeinem Grund fehlschlägt.Die Registrierung und das Dateisystem werden von diesem magischen Koordinator für verteilte Transaktionen automatisch für Sie bereinigt.

Wie ist es möglich, dass auf diese Weise mit zwei unterschiedlichen Systemen Geschäfte gemacht werden können?Mir scheint, dass es immer möglich ist, das System in einem inkonsistenten Zustand zu belassen, in dem das Dateisystem seine Änderungen übernommen hat und die Registrierung dies nicht getan hat.Ich denke, dass es in MSDTC sogar möglich ist, eine Transaktion über das Netzwerk durchzuführen.

ich habe gelesen http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx, aber es scheint nur der Anfang der Erklärung zu sein und Schritt 4 sollte erheblich erweitert werden.

Bearbeiten: Soweit ich weiß http://en.wikipedia.org/wiki/Distributed_transaction, kann dies durch ein zweiphasiges Commit erreicht werden (http://en.wikipedia.org/wiki/Two-phase_commit).Nachdem ich das gelesen habe, verstehe ich die Methode immer noch nicht zu 100 %, es scheint, als gäbe es zwischen den Schritten viel Spielraum für Fehler.

War es hilfreich?

Lösung

über "Schritt 4":

  

Die Transaktionsmanager Koordinaten   mit den Ressourcen-Manager, um sicherzustellen,   dass alle erfolgreich die angeforderten zu tun   wenn getan arbeiten oder keine der Arbeit, so   Aufrechterhaltung der ACID-Eigenschaften.

Dies erfordert natürlich alle Teilnehmer die richtigen Schnittstellen zu schaffen und (fehlerfrei) Implementierungen. Die Schnittstelle sieht aus wie vage diese:

public interface ITransactionParticipant {
    bool WouldCommitWork();
    void Commit();
    void Rollback();
}

Die Transaction Manager bei Festschreibungszeit fragt alle Teilnehmer, ob sie bereit sind, um die Transaktion zu begehen. Die Teilnehmer können diese nur geltend machen, wenn sie diese Transaktion unter allen zulässigen Fehlerbedingungen begehen können (Validierung, Systemfehler, usw.). Nachdem alle Teilnehmer die Möglichkeit, geltend gemacht haben, die Transaktion zu begehen, sendet der Manager an alle Teilnehmer die Commit() Nachricht. Wenn jeder Teilnehmer statt einen Fehler oder mal hebt heraus, die gesamte Transaktion abgebrochen und einzelne Mitglieder werden zurückgesetzt.

Dieses Protokoll erfordert die Teilnehmer vor der Durchsetzung ihrer Fähigkeit zu begehen aufgezeichnet ihre gesamte Transaktion Inhalt haben. Natürlich hat dies in einer speziellen lokalen Transaktionsprotokollstruktur in die Lage sein, aus verschiedenen Arten von Fehlern zu erholen.

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