![]() |
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Muss die Anzeige denn tatsächlich so aktuell sein? Unabhängig davon wie oft Du die Anzeige aktualisierst ist sie wie Du auch schreibst nie 100%-ig aktuell. Dann brauchst Du also sowieso eine Routine, die prüft, ob der gewählte Datensatz noch zu bearbeiten ist.
Also: - Komplette Liste der noch zu bearbeitenden Datensätze wird angezeigt - Der Anwender wählt einen Datensatz zur Bearbeitung - Das Programm prüft, ob der inzwischen gesperrt ist oder schon bearbeitet wurde - Der Datensatz wird gesperrt und nach der Bearbeitung z.B. mit Änderungsdatum gekennzeichnet - Die Liste wird neu geladen Optional kann der Anwender die Liste auch manuell neu laden. Am besten sortiert man die Liste zufällig, damit nicht alle Anwender oben anfangen und sich um die ersten Datensätze streiten. Wenn es unbedingt sein muss, kannst Du natürlich trotzdem regelmässig mit einer separaten Abfrage ermitteln, welche Datensätze gesperrt oder bereits bearbeitet wurden. Wenn es ein Datumsfeld dafür gibt (Letzte Änderung) kannst Du gezielt nur die abfragen, die sich seit dem letzten Abruf geändert haben. Die Haupttabelle wird dann neu gezeichnet und dabei - wenn der Datensatz auch in der Änderungstabelle existiert - eingefärbt. Nach einer Bearbeitung durch den Anwender lädst Du automatisch neu, so dass er jetzt nur noch die Unbearbeiteten sieht. Eine Abfrage jede Sekunde ist dabei doch wahrscheinlich gar nicht notwendig solange es kein Wettbewerb ist und die Anwender alle gleichzeitig auf die Daten losgelassen werden und sich um "die besten Datensätze" streiten. Ansonsten eben einen Messagebroker einsetzen (als Ersatz für das Chattool, das rapante erwähnte) Oder wie Du schon schreibst, den Auftrag nicht annehmen, wenn man nicht davon überzeugt ist. |
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Zitat:
|
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Wenn jeder Anwender jeden Datensatz bearbeiten kann, dann lass sie das doch einfach machen. Beim Schreiben der Änderung in die DB kannst du ja mit einer WHERE-Klausel, die alle (relevanten) vorigen Werte enthält, sicherstellen, dass der Datensatz noch unverändert ist. Falls dem nicht so ist, ändert das UPDATE nichts und du kannst das ja dem Anwender mitteilen.
Bei FireDAC kann man das weitegehend automatisieren in dem in der Query bei UpdateOptions.UpdateMode das upWhereAll oder upWhereChanged einstellt. |
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Zitat:
Da man ja auch einfach nur so durch eine solche Liste scrollen kann, um sich vielleicht die besten Einträge rauszusuchen, wollte ich die Auswahl des Datensatzes noch nicht in die DB schreiben sondern die ID des Datensatzes nur auf die Sperrliste nehmen und schnellstmöglich an alle anderen Anwender verteilen. |
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Zitat:
|
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Zitat:
|
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Würde es nicht reichen, die Sperrung beim Versuch, den Datensatz zu bearbeiten, zu überprüfen?
Es mag vielleicht von dem konkreten Anwendungsfall abhängen, aber ich finde eine Live-Aktualisierung der aktuellen Sperrungen im Sekundentakt schon etwas übertrieben. |
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Zitat:
|
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Zitat:
Es geht bei den Aktualisierungsinformationen auch wirklich nur um die IDs der gesperrten Datensätze; was ein anderer Anwender mit dem Datensatz gemacht hat, ist völlig egal und muss auch nicht angezeigt werden. Nur eben der Status, dass dieser Datensatz nicht mehr bearbeitet werden kann. |
AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
TL;DR;
Ich würde nicht versuchen die Tabelle selbst zu locken. Wäre es nicht denkbar mit einer zweiten, schnellen Lock-Tabelle zu arbeiten, bevor man dann die eigentliche Tabelle ändert? Der Erste, der da einen Record belegt setzt ein Flag mit Timestamp und der schnellere gewinnt. Wenn weitere den gleichen Record locken wollen, dann sollte es krachen. Danach kann man doch in aller Ruhe den Record bearbeiten. Zusätzlich könnte diese Lock-Tabelle eine Kopie des eigentlichen Records enthalten. Nach einer Änderung könnte man das dann wieder freigeben, indem man nur den Status auf READY ändert. Dann könnte ein anderer Prozess meinetwegen regelmäßg drüberlaufen und alle die READY sind abschliessen und zum Zielrecord übertragen. So würde keiner direkt auf der Ziel-Tabelle arbeiten, sondern immer nur über die "Shadow"-Tabelle, die nach einer Bearbeitung sich selbst aufräumen kann. Das Ganze könnte man noch mit StoredProcedures und Transactions garnieren. Ist es vielleicht sowas, was Dein Kunde sucht? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz