mysql:transaction.commit - Netzwerkverbindung bricht ab



  • Hallo Forum,

    mir ist eben die Frage eingefallen, was passiert wenn eine Netzwerkverbindung
    genau in dem Moment abbricht, nach dem COMMIT erfolgreich gesendet wurde. Die
    Antwort vom Server aber nicht beim Client ankommt.

    Beispiel:

    if( Client startet für lokale Datenbank die Transaktion: erfolgreich )
    {
     Client startet für entfernte Datenbank die Transaktion
    
     Synchronisation
    
     if ( Client beendete für entfernte Datenbank: erfolgreich )
     {
      Client beendet für lokale Datenbank die Transaktion
     }
    }
    

    Auf ein COMMIT sendet der Server eine Antwort, und genau diese kommt
    aber nicht an. Der Client führt ein lokales ROLLBACK aus was genau
    falsch ist 🙂

    Es entstehen Dubletten, wenn der Vorgang erneut ausgeführt wird.

    Gibt es eine andere Lösung als nach Feststellung dieses Fehlers eine
    irgendwie besonders geartete Art der Synchronisation durchzuführen ?

    Eine Transaktion pro Datensatz bzw. Datensatzgruppe ( Master/Childs )
    wäre würde das Problem von massig Datensalat zwar verhindern. Das Problem
    würde sich aber immer noch auf wenige Datensätze belaufen.



  • Elegante Lösungen gibt es nur, wenn man garantieren kann, dass eine der beiden Transaktionen (die am Client oder die am Server) in jedem Fall immer möglich ist.
    Bzw. genauer: dass es nur temporäre Gründe geben kann die die Durchführung verhindern könnten, wie z.B. Timeout, Disk-Full, Server offline etc.

    Dann kann man den Teil der "immer kann" einfach zum Slave machen, und der andere Teil ist der Master. Das primäre Commit passiert dann immer beim Master, und danach wird am Slave nachgezogen was nachzuziehen ist.

    Wenn der Vorgang unterbrochen wurde, muss man dann nur nachgucken ob am Master schon committed wurde. Und natürlich muss sich im Fall "ja" ermitteln lassen ob auch am Slave schon committed wurde, damit man weiss ob man dort die Transaktion wiederholen muss.



  • Danke für die Antwort !

    ich müsste also erst am Client die Transaktion zuerst beenden.
    ( die AutoIncrement-Werte neuer Datensätze im Server stünden dann im Client )

    Wenn ein Fehler beim abschließendem Commit am Server fehlschlägt, könnte
    ich den Server abfragen ob die IDs in dessen Datenbank sind oder nicht.

    Wenn ja, alles okay ( commit erreichte den Server, Antwort kam nicht am Client an )

    Wenn nein, die IDs lokal wieder auf 0 setzen ( verwerfen ) und alle Datensätze erneut übertragen
    ( insert into (id, col) values (0, val) On Duplicate Key (col=val)

    Jo, so müsste es funktionieren können 🙂

    🙂


Log in to reply