2017-03-05 3 views
0

Ich habe eine Frage zum Umgang mit Datenbanktransaktionen.Wie behandelt Datenbank diesen Status in Transaktion?

Wenn die Datenbank heruntergefahren wird, wenn die Transaktion einige Daten in einen dauerhaften Speicher geschrieben hat, aber nicht alle, wie lösen sie diesen Zustand auf?

(+) Wie kann Client, der automatische Wiederholungslogik hat, den Zustand behandeln, dass die Datenbank die Transaktion beendet, aber die Verbindung getrennt wurde, bevor die Antwort erhalten wurde?

Danke fürs Lesen.

Antwort

0

Eine gängige Lösung für die Wiederherstellung nach einem DBMS-Absturz ist der Algorithmus ARIES. Einfach gesagt, verwaltet die Datenbank eine write-ahead-log, auf die alle Änderungen geschrieben werden, bevor sie angewendet werden. Nach einem Absturz macht der Wiederherstellungs-Manager die Änderungen rückgängig, die nicht festgeschrieben wurden, und stellt sicher, dass alle festgeschriebenen Änderungen auf den Datenträger geschrieben werden.

(+) Das Schöne an relationalen Datenbanken ist die Tatsache, dass sie ACID Garantien bieten. Aufgrund der durability-Eigenschaft wissen Clients sicher, dass alle erfolgreich festgeschriebenen Transaktionen auf dem Datenträger wiedergegeben werden und daher das DBMS-Crashszenario nicht auf besondere Weise behandelt werden muss.

+0

Gibt es eine Möglichkeit, dies zu kontrollieren?/ 1) Request Transaktion Client -> DB/ 2) Verarbeitung der Transaktion in DB/ 3) Disconnect-Client Bevor Got Transaktions-Antwort/ 4) Client versuchen, DB/ 5) Client Retry Anfrage Transaktion erneut/ = wieder angeschlossen > Transaktion wird zweimal angefordert. (Zwei Anfragen -> Zwei Transaktionen)/ Gibt es einen Weg dies zu verhindern?/ Ich denke, nur ein Weg, um dieses Problem zu lösen, ist vor Retry Request zu überprüfen./ Aber es ist schwer. – RedJune

+0

Diese Frage bezieht sich auf http://stackoverflow.com/questions/42605651/how-to-handle-message-that-failed-to-response-success-but-success-commit-to-dat – RedJune

+0

Ich denke, du bist Recht. In Ihrem Szenario weiß nur die DB, ob die Transaktion erfolgreich war oder nicht. Daher scheint es, als ob die einzige Möglichkeit für den Client, zu wissen, ob ein erneuter Versuch erforderlich ist, wäre, die Datenbank anzufordern. –

Verwandte Themen