Betrachten Spring MVC
Java-Web-Anwendung, die einige REST API
bietet.Verhindern REST-Clients gleichzeitige Ausführung derselben Methoden mit denselben Argumenten
Lassen Sie uns sagen, dass es viele Methoden hat, einer von ihnen ist DELETE /api/foo/{id}
, die offensichtlich mit bestimmten id
foo
Entität aus der DB gelöscht.
Das Problem ist, dass aufgrund der großen Daten in der DB, dieser Vorgang nicht sofort, also, wenn Client versucht gleichzeitig mehrfach führen Operationen an derselben Einheit löschen, sagt
DELETE /api/foo/123
x N-mal (versehentlich in Client-Software natürlich),
es verursacht einige unangenehme Nebenwirkungen in der DB (wissen Sie, wenn Sie versuchen, gleiche Einheit in mehreren Transaktionen zu löschen, das ist nicht allgemein nett).
Meine Frage ist: Was ist die beste Praxis in Spring MVC
, um solche Situationen zu verhindern?
Ich kann sicherlich die Synchronisation auf Foo
ID in jeder solchen Update-Methode einführen (PUT/DELETE
). Ich muss es für alle Entitäten und alle PUT/DELETE
API-Methoden tun, die ich wirklich nicht machen möchte. Ich nehme an, es sollte eine elegante und schöne Lösung sein, wie man eine solche Art von Synchronisation auf dem Interceptor/Servlet-Level durchführt, d. H. Nicht auf dem Controller-Level.
Ich kann auch spezifische Interceptor erstellen und dort warten auf doppelte Anfragen (Anfragen mit derselben URL und Parameter). Aber wieder klingt es nicht als eine elegante Lösung (bis ich sichergestellt werde, dass es nicht möglich ist, in Spring MVC
irgendwie in Schönheit Weise zu konfigurieren).
Prinzipiell ist der Transaktionsmechanismus für diesen Zweck ausgelegt. Welche weiteren Anforderungen haben Sie an die Transaktion Rollback als ** unangenehme Nebenwirkungen in der DB **? –
Ja, das Problem ist, dass verschiedene DBs für solche Ereignisse ein anderes Verhalten haben. In meinem Fall hatte ich wegen der komplexen Replikationsstruktur eine Art Blockierung. Ich möchte generell keine solchen Ausnahmen von der DB einfangen und erhalten, ich möchte ihr Erscheinen verhindern. – Andremoniy
Ich bin richtig oder falsch. Ich weiß nicht, wie wir wissen, können wir eine Sache tun, nur überprüfen, ob die Daten in db verfügbar sind oder nicht wie getFooById (id); Wenn Sie die Daten erhalten, können Sie dieselben Daten löschen, andernfalls können Sie die Ausnahme auslösen, dass keine Daten vorhanden sind. –