AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

Ein Thema von Papaschlumpf73 · begonnen am 19. Jun 2024 · letzter Beitrag vom 21. Jun 2024
Antwort Antwort
Benutzerbild von rapante
rapante

Registriert seit: 3. Jun 2009
Ort: OPR
172 Beiträge
 
Delphi 12 Athens
 
#1

AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

  Alt 20. Jun 2024, 08:27
Moin,
für unseren Kalender/Ressourcenplaner gab es ähnliche Anforderungen. Es sollte vernmieden werden, dass 2 Leute gleichzeitig einen Datensatz bearbeiten. Änderungen sollen sofort für alle Clients sichtbar sein.

Gelöst haben wir das vor Jahren über einen ChatServer. Alle Clients sind Mitglieder des Chats. Änderungen/Locks (Datensatz ID/Status) werden in die Datenbank geschrieben und im Chat publiziert. Jeder Client prüft für sich, ob ein Refresh der aktuellen Ansicht nötig ist.
Unmittelbar vor dem Bearbeiten eines Datensatzes wird noch einmal geprüft, ob er eventuell gesperrt ist (DB-Abfrage) und ggf. eine Meldung angezeigt.

Anstelle eines Chatserver kann man das heute wohl eleganter lösen, aber das Prinzip sollte das gleiche sein
Micha
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.645 Beiträge
 
Delphi 12 Athens
 
#2

AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

  Alt 20. Jun 2024, 09:30
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
461 Beiträge
 
Delphi 12 Athens
 
#3

AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

  Alt 20. Jun 2024, 09:36
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.
Das eigentliche Problem ist etwas anders. Ich muss den Datensatz schon für die anderen Anwender sperren, wenn er durch einen Anwender ausgewählt wird - also noch gar nicht verändert wurde. Es könnte sich ja theoretisch um eine Anrufliste handeln, in der nur das Ergebnis vermerkt werden soll. Wenn ein Anwender einen Datensatz auswählt, sollte er daher schon für die anderen gesperrt sein, damit nicht zwei Anwender gleichzeitig anrufen, bevor sie dann versuchen das Ergebnis zu dokumentieren.

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.
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
535 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

  Alt 20. Jun 2024, 10:10
Das eigentliche Problem ist etwas anders. Ich muss den Datensatz schon für die anderen Anwender sperren, wenn er durch einen Anwender ausgewählt wird - also noch gar nicht verändert wurde. Es könnte sich ja theoretisch um eine Anrufliste handeln, in der nur das Ergebnis vermerkt werden soll. Wenn ein Anwender einen Datensatz auswählt, sollte er daher schon für die anderen gesperrt sein, damit nicht zwei Anwender gleichzeitig anrufen, bevor sie dann versuchen das Ergebnis zu dokumentieren.

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.
Vielleicht verstehe ich es nicht richtig. Was hindert denn den Server daran alle (anderen) Clients zu notifizieren wenn einer einen Datensatz "sperrt" (von mir aus auch nur selektiert)? Wie ist denn die Client/Server Kommunikation realisiert?
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.645 Beiträge
 
Delphi 12 Athens
 
#5

AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

  Alt 20. Jun 2024, 10:39
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
461 Beiträge
 
Delphi 12 Athens
 
#6

AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

  Alt 20. Jun 2024, 10:49
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.
Finde ich nicht ganz so toll und würde ich so auch nicht anbieten wollen. Der Anwender würde eine lange Liste mit Datensätzen sehen. Jetzt klickt er einen an und merkt erst dann, dass dieser DS gesperrt ist, beim nächsten Datensatz dann ggf. das gleiche nochmal. Und beim Scrollen durch die Liste (Bleifinger auf CURSOR_DOWN) werden dann die Prüfungsanfragen an den SQL-Server im 100-Millisekundentakt abgefeuert.

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.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.174 Beiträge
 
Delphi 12 Athens
 
#7

AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

  Alt 20. Jun 2024, 11:13
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?
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.371 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

  Alt 20. Jun 2024, 14:31
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.
Finde ich nicht ganz so toll und würde ich so auch nicht anbieten wollen. Der Anwender würde eine lange Liste mit Datensätzen sehen. Jetzt klickt er einen an und merkt erst dann, dass dieser DS gesperrt ist, beim nächsten Datensatz dann ggf. das gleiche nochmal. Und beim Scrollen durch die Liste (Bleifinger auf CURSOR_DOWN) werden dann die Prüfungsanfragen an den SQL-Server im 100-Millisekundentakt abgefeuert.
Ich denke, dass das anders gemeint war. Wenn ein DS gesperrt ist, gibt es ein Refresh aller Datensätze. Dann muss nicht jeder einzelne geprüft werden.
Peter
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
461 Beiträge
 
Delphi 12 Athens
 
#9

AW: Hunderte Clients im Sekundentakt über gesperrte Datensätze informieren

  Alt 20. Jun 2024, 10:43
Das eigentliche Problem ist etwas anders. Ich muss den Datensatz schon für die anderen Anwender sperren, wenn er durch einen Anwender ausgewählt wird - also noch gar nicht verändert wurde. Es könnte sich ja theoretisch um eine Anrufliste handeln, in der nur das Ergebnis vermerkt werden soll. Wenn ein Anwender einen Datensatz auswählt, sollte er daher schon für die anderen gesperrt sein, damit nicht zwei Anwender gleichzeitig anrufen, bevor sie dann versuchen das Ergebnis zu dokumentieren.

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.
Vielleicht verstehe ich es nicht richtig. Was hindert denn den Server daran alle (anderen) Clients zu notifizieren wenn einer einen Datensatz "sperrt" (von mir aus auch nur selektiert)? Wie ist denn die Client/Server Kommunikation realisiert?
Die Clients verbinden sich direkt via TADOConnection mit dem SQL-Server.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 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