2017-06-29 3 views
-2

Mein Hintergrund ist wie ein PHP-Entwickler, so dass ich nicht ganz sicher bin, wie man mit dieser Race-Bedingung zu tun habe Ich hatte Probleme mit Java-Servlets und das Hibernate-Framework.Verhindern von Race-Bedingungen mit Java

Grundsätzlich versuche ich Doppelanmeldungen von Zahlungsanforderungen auf dem Backend zu verhindern. Wenn die Zahlungsanforderung eingeht, prüfe ich die DB nach dem aktuellen Zahlungsstatus des Kunden. Wenn es "UNPAID" ist, aktualisiere ich die DB auf "VERARBEITEN" und fahre damit fort, die Zahlung zu verarbeiten und setze sie schließlich auf "BEZAHLT", wenn alles fertig ist.

Ich glaube jedoch, dass Hibernate meine DB-Updates nicht ausführt, bis die Sitzung geschlossen wird. Das bedeutet, wenn eine zweite Anfrage eingeht, bevor meine erste Zahlungsanforderung verarbeitet wurde, wird die Zahlungsanforderung ein zweites Mal bearbeitet.

In PHP würde ich nur überprüfen und den Zahlungsstatus aktualisieren, sobald die Zahlungsseite getroffen wurde, und ich habe nie Probleme mit Race Conditions dabei. Dieses Muster, das ich zuvor verwendet habe, funktioniert jedoch nicht in der Java-Umgebung, in der ich entwickle.

Hat jemand eine Idee, was der richtige Weg wäre, dies zu tun?

+0

Die Antwort dazu wäre viel zu komplex und breit für Stackoverflow. Wenn Sie das Lesen aus Ihrer Datenbank verhindern möchten, sollten Sie das Datenbanksperrsystem verwenden. –

+0

Könnten Sie nicht ein wenig mehr Informationen geben? Ich habe sehr begrenzte Erfahrung mit Java und "das Datenbank-Lock-System" ist nicht etwas, auf das ich vorher gestoßen bin. – user7862512

+0

Servlets sollten so geschrieben werden, als ob jede Anfrage single-threaded wäre. Stellen Sie sicher, dass Ihre Datenbank mit der entsprechenden Isolationsstufe transaktional schreibt. Es wird funktionieren. Beginnen Sie mit dem JDBC-Lernprogramm: https://docs.oracle.com/javase/tutorial/jdbc/ – duffymo

Antwort

1

Basierend auf Ihrer Beschreibung würde ich sagen, dass Ihr PHP-Code versteckte Race-Bedingungen hat und Sie es einfach nicht realisieren. Sie müssen das aus einem anderen Blickwinkel angehen. Geben Sie die Annahme auf, dass Sie doppelte Vormerkungen verhindern können und stattdessen annehmen, dass sie unvermeidlich sind. Sobald Sie feststellen, dass dies der Fall ist, können Sie ein passendes Design erstellen (das wahrscheinlich viel anders ist als das, was Sie derzeit haben). Wenn Sie Ihr Schema und einen Beispielcode posten können, kann ich möglicherweise einige Vorschläge machen.

Verwandte Themen