Hallo zusammen.
Eine Webanwendung speichert Formulardaten in einer Datenbank.
Es gibt also einen Senden-Button, welcher eine Backend-Methode zur Speicherung ausführt.
Per EFCore werden die Daten dann gespeichert.
Es scheint nun so, dass unser Datenbankserver ab und zu Probleme damit hat, Verbindungen aufzubauen.
Das daraus resultierende eigentliche Problem gestaltet sich aber folgendermaßen:
Absendebutton wird gedrückt, es wird versucht, die DB - Verbindung herzustellen, was aber in seltenen Fällen 5-8 Sekunden dauern kann.
Der User der Webanwendung wartet kurz und drückt dann nochmals auf Absenden, da es anscheinend beim ersten Mal nicht funktioniert hat.
Somit wird die "hängende" Methode erneut aufgerufen und EFCore versucht nochmals die Verbindung aufzubauen.
Irgendwie, irgendwo laufen also 2 Threads und beide "hängen" beim Verbindungsaufbau. (Using)
Geht es dann, so werden die Formulardaten doppelt in der DB gespeichert, da die Funktion zweimal aufgerufen wurde.
Der Verbindungsaufbau wird per Using gemacht:
using (con= new MyContext())
{
//
}
Und irgendwo hier hängt es dann.
Aus meiner Sicht ist das Problem, dass die Verbindung 2x aufgebaut und die Tabelle 2x in 2 verschiedene DbContext gelesen wird.
Deshalb schlagen Prüfungen, ob der Eintrag schon vorhanden ist (spezielle Kombination aus Key+ weitere Felder) fehl.
Es ist also ein Grundsatzproblem, was ich nicht verstanden habe.
Entprellung des Sendenbuttons und Hinweise in der Webanwendung- Ja.
Prüfung, ob der Eintrag schon in der DB existiert - Ja ( nützt hier aber nichts)
Klärung, warum die DB ab und zu die Verbindung so langsam aufbaut - Ja.
Damit kann man das Problem entschärfen oder umgehen, aber gelöst ist es grundsätzlich nicht.
Parallelitäts Erkennung nützt hier mMn nach auch nicht viel, da in die Tabelle nur geschrieben wird und derselbe Datensatz nicht von mehreren verändert wird.
Was ist hier also das Problem am Design, was habe ich nicht verstanden und wie hieße das "Zauberwort" für so einen Fall?
Ganz herzlichen Dank im Voraus.