AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken MSSQL Server mit 100 Clients
Thema durchsuchen
Ansicht
Themen-Optionen

MSSQL Server mit 100 Clients

Ein Thema von egentur · begonnen am 29. Apr 2018 · letzter Beitrag vom 10. Jun 2018
Antwort Antwort
Benutzerbild von Bernhard Geyer
Bernhard Geyer
Online

Registriert seit: 13. Aug 2002
17.228 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: MSSQL Server mit 100 Clients

  Alt 29. Apr 2018, 12:13
Ein Sperren des Datensatzes zur Bearbeitung würde ich persönlich nicht realisieren. Das bringt mehr Probleme als es löst.
Es wird immer auf dem Anwendungsfall ankommen.
Wenn es normal ist das z.B. 1 Stunde auf einen Datensatz gearbeitet wird, wird man sich keine Freude machen, wenn der User erst nach 1 Stunde mitbekommt das seine Arbeit "für die Katz ist".
Ein Mergen der Änderungen wird für die meisten Nutzer zu komplex sein um Sie praktikabel zu Nutzen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: MSSQL Server mit 100 Clients

  Alt 29. Apr 2018, 12:38
Es wird immer auf dem Anwendungsfall ankommen.
Sicher.

Wenn es normal ist das z.B. 1 Stunde auf einen Datensatz gearbeitet wird, wird man sich keine Freude machen, wenn der User erst nach 1 Stunde mitbekommt das seine Arbeit "für die Katz ist".
Genauso wird der zweite Benutzer vielleicht knatschig, weil er seine Mini-Änderung eine Stunde lang nicht unterbringen kann. Wenn dieser andere Client eine Applikation ist, die nur ein eh automatisch verwaltetes Statusfeld aktualisieren will, kann das schon erhebliche Auswirkungen auf den Betriebsablauf haben.

Richtig spanned wird es dann, wenn zu dem Datensatz noch etliche abhängige Datensätze gehören, die womöglich noch alle mit gesperrt werden müssen.

Ein Mergen der Änderungen wird für die meisten Nutzer zu komplex sein um Sie praktikabel zu Nutzen.
Da stimme ich dir zu. Aus meiner Erfahrung sind aber in der Regel nur nicht-relevante Felder betroffen, da die Sachbearbeiter meistens nicht-überlappende Daten ändern. Hier kann man durch anwendungsspezifisches Setzen der ProviderFlags für jedes Feld schon einen Großteil der Kollisionen vermeiden. Das erfordert natürlich ein umfassendes Wissen über die Beziehungen der einzelne Felder untereinander. In der Praxis kommen dann echte Kollisionen kaum noch vor.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von timog
timog

Registriert seit: 26. Sep 2006
Ort: Landkreis Oldenburg (Oldb)
117 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: MSSQL Server mit 100 Clients

  Alt 29. Apr 2018, 13:58
Hier kann man durch anwendungsspezifisches Setzen der ProviderFlags für jedes Feld schon einen Großteil der Kollisionen vermeiden.
Stichwort ProviderFlags bei FireDAC (wie ist das bei AnyDAC?): TUpdateMode (Wiki) im Auge behalten. In den Tokyo FireDACs steht der TUpdateMode z.B. im Standard auf upWhereKeyOnly - ein upWhereAll oder upWhereChanged wäre je nach Anforderung zu überlegen.
Timo
Real Programmers are surprised when the odometers in their cars don't turn from 99999 to 9999A.

Geändert von timog (29. Apr 2018 um 14:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von trifid
trifid

Registriert seit: 12. Sep 2003
297 Beiträge
 
#4

AW: MSSQL Server mit 100 Clients

  Alt 30. Apr 2018, 08:03
Die Frage war:
"Was ist hier der beste Ansatz, damit gegenseitiges Blockieren u.ä. verhindert wird ?"
Vielleicht hilft eine Diskussion über eine Architktur der Anwendung hier weiter, bevor man den Datenbankserver schlecht redet.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: MSSQL Server mit 100 Clients

  Alt 30. Apr 2018, 08:22
Vielleicht hilft eine Diskussion über eine Architktur der Anwendung hier weiter, bevor man den Datenbankserver schlecht redet.
Architekturfragen wurden bereits einige angesprochen.
Was meinst Du mit "schlechtreden"?
Eine Architektur lässt sich ohne Betrachtung der Servereigenschaften/-fähigkeiten nur unzureichend diskutieren.
Die Frage wäre m.E. eher, ob der TE zu seiner Frage noch ein paar Details liefert.
Gruß, Jo
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.563 Beiträge
 
Delphi 7 Professional
 
#6

AW: MSSQL Server mit 100 Clients

  Alt 30. Apr 2018, 08:25
Eventuell hilft auch erstmal eine grobe fachliche Beschreibung dessen, was realisiert werden soll.

Dann muss man sich das erforderliche Transaktionshandling mal anschauen.

Welche Datenmenge liegt insgesamt vor?
Wieviele Daten werden in welchem Zeitraum verändert?
Wie groß ist überhaupt die Wahrscheinlichkeit, dass bei Änderungen Konflikte auftreten? (Gemeinsam zu bearbeitende Schnittmenge?)

100 Clients, die hauptsächlich lesend auf die Daten zugreifen, dürften kaum das Problem sein.
100 Clients, die permanent alle Daten ändern, wohl schon eher.
Wo dazwischen müssen wir hier konkret die 100 Clients einordnen?

Jeder Client sollte soviel Daten wie nötig zeitgleich vorhalten und so wenig wie möglich.
Alles, was zur Änderung benötigt wird, sollte möglichst kurz auf dem Client vorgehalten werden.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.013 Beiträge
 
#7

AW: MSSQL Server mit 100 Clients

  Alt 1. Mai 2018, 19:47
In einem sehr großen Projekt vom mir habe ich das so gelöst, dass ich in den datenrelevanten Tabellen ein Feld vorgesehen habe, in welchem der aktuelle Username hinterlegt wird, welcher den Datensatz gerade zum Bearbeiten geöffnet hat.

Das hat für mich 3 Vorteile:

1. Bei eventuellem späterem Wechsel auf eine andere DB muss ich im Code wenig ändern und bin auch nicht davon abhängig, wie das in der DB gelöst ist.
2. Da ich den Datensatz eh für die Anzeige lesen muss, zeige ich dem User "vor" dem Bearbeiten an, dass dieser Datensatz nicht bearbeitet werden kann. (Lesen ich aber möglich)
3. Ich zeige ihm an welcher User diesen Datensatz blockiert, dann weiß er an wen er sich wenden muss und läuft nicht fragend von Büro zu Büro.

Um Probleme zu vermeiden wird beim Programmstart und beim Programmende alle Einträge des Users in besagtem Feld gelöscht, also alle Datensätze, die evtl. noch belegt sind, freigegeben.

Und zu guter Letzt gibt es im Programm dann noch eine Funktion einen evtl. fälschlich (durch Programmabsturz / Windows-Absturz / Stromausfall / etc.) belegten Datensatz manuell freizugeben, mit dem Hinweis wer zuletzt speichert hat gewonnen.

Damit fahre ich seit mehr als 10 Jahren in dieser Anwendung sehr gut und ohne Probleme für die User oder die Daten, bei bis zu 50 User und einigen 100.000 Datensätzen.

Ich muss aber dazusagen, dass ich nicht mit DB-Controls wie DBGrid etc. arbeite, sondern ausschließlich mit TObjectList's welche die Daten per Query lesen und schreiben.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.248 Beiträge
 
Delphi 12 Athens
 
#8

AW: MSSQL Server mit 100 Clients

  Alt 2. Mai 2018, 07:05
1) Selects immer(!) mit WITH NOLOCK
2) Transaktionen möglichst kurz und klein halten
3) Commit niemals dem User überlassen
4) Pro Tabelle einen PK (no na) und ein Feld SERIAL, das bei jeder Änderung durch den User von der Software hochgezählt wird. Beim Update kann man dann die Where Klausel auf den PK und eben dieses Feld beschränken, mit einem Index da drauf geht das auch flott.
5) Record vs Page vs Table Locking und Lock Escalation verstehen
6) Deadlocks verstehen

Das wars. MSSQL Server mit 100 Clients ist seit v2000 kein Problem.
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.261 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: MSSQL Server mit 100 Clients

  Alt 10. Jun 2018, 07:28
Ein Sperren des Datensatzes zur Bearbeitung würde ich persönlich nicht realisieren. Das bringt mehr Probleme als es löst.
Es wird immer auf dem Anwendungsfall ankommen.
Wenn es normal ist das z.B. 1 Stunde auf einen Datensatz gearbeitet wird, wird man sich keine Freude machen, wenn der User erst nach 1 Stunde mitbekommt das seine Arbeit "für die Katz ist".
Ein Mergen der Änderungen wird für die meisten Nutzer zu komplex sein um Sie praktikabel zu Nutzen.
Man sollte es auch so einstellen, das nur die geänderten Felder gespeichert werden und auch nur hier nach einem Konflikt geschaut wird. D.h. in der Praxis können mehrere Personen den gleichen Datensatz bearbeiten. Einer macht den Katalogtext, der andere die Preise, der nächste vielleicht Bilder.

So kann man den Mehrbenutzerzugriff auch realisieren. Wenn natürlich mehrere User das gleiche Feld bearbeiten (z.B. Preis) und auch noch was unterschiedliches reinschreiben, dann ist das natürlich Sinnfrei .....

Ansonsten muss man das aus vom Datenbankaufbau berücksichtigen: z.B. Bemerkungen, hier könnten gleichzeitig mehrer Benutzer was reinschreiben wollen, dann muss man den aufbau z.B. über eine 1zun Beziehung machen ......
  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:36 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