AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Programmablauf synchron? [Verständnisfrage]
Thema durchsuchen
Ansicht
Themen-Optionen

Programmablauf synchron? [Verständnisfrage]

Ein Thema von Dragon27 · begonnen am 30. Aug 2009 · letzter Beitrag vom 31. Aug 2009
Antwort Antwort
Dragon27

Registriert seit: 20. Nov 2003
Ort: Aßling
543 Beiträge
 
Delphi XE6 Enterprise
 
#1

Programmablauf synchron? [Verständnisfrage]

  Alt 30. Aug 2009, 21:29
Hallo,

ich bastle gerade einen kleinen Chatserver der mit einer Datenbank gekoppelt ist. Nun bin ich beim erstellen
der "UserAnmelden" Function auf ein Problem gestoßen.

Ich habe auf dem Formular eine Query-Komponente bei der dann ein SQL-String ausgeführt wird. Eben um einen
neuen User hinzuzufügen zu Datenbank. Nun werde ich die Komponente ja sicherlich öfters verwenden... sprich
Login, etc.

Was passiert nun wenn 2 User sich zur gleichen Zeit anmelden... es ist ja nur eine Komponente auf dem Form?
Im Normalfall müsste das ganze ja nacheinander abgearbeitet werden... aber die Chatkomponente arbeitet ja mit
Threads... so könnte doch prinzipiell ein Kollision die Folge sein... oder?

Danke für Eure Hilfe!
Delphi is ......... DELPHI!!
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#2

Re: Programmablauf synchron? [Verständnisfrage]

  Alt 30. Aug 2009, 21:39
Ich glaube nicht, dass die Query-Komponente threadsafe ist.

Ich schätze mal, dass Du hier Event-Gesteuert arbeitest, oder?
In dem Fall würde ich mittels Mutexen bzw. Critical Sections jeden DB-Zugriff kapseln - oder alternativ jeden Thread seine eigene DB-Komponenten erstellen lassen - was dann aber viele Connections zur folge haben kann. Also lieber eine Critical Section für jeden DB-Zugriff.

Lesende Zugriffe kannst Du ja für einige Sekunden cachen und ggf. für mehrere User verwenden (z.B. die letzten Chatnachrichten im Channel). Natürlich verzögert das dann das Lesen etwas, aber auf 1-2 Sekunden kommt es glaube ich nicht zwangsläufig an.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

Re: Programmablauf synchron? [Verständnisfrage]

  Alt 30. Aug 2009, 22:12
In einem Thread sollte man eigentlich keine Komponente, die auf einem Form liegt verwenden, denn ich spreche ja immer genau das gleiche Objekt an.
Zudem ist die Komponente auf dem Form so zu sehen, wie eine Caption, ein Button, etc. und die sollten aus einem Thread ja auch nicht direkt angesprochen werden.

Erzeuge in deinem Thread die Komponente, führe den SQL-Code aus und dann die Komponente wieder aus dem Speicher werfen (Der Mohr hat seine Schuldigkeit getan).

Wegen dem SQL-Server brauchst du dir keinen Kopf machen, der führt die Abfragen nacheinander aus

cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Programmablauf synchron? [Verständnisfrage]

  Alt 31. Aug 2009, 08:14
Zitat von Sir Rufo:
Wegen dem SQL-Server brauchst du dir keinen Kopf machen, der führt die Abfragen nacheinander aus
Wie kommst Du denn darauf? So ein RDBMS ist doch gerade dazu da, massiv parallel Datenbankabfragen und -Operationen durchzuführen. Du als Programmierer hast nun die Aufgabe, diese parallelen Aktionen so zu gestalten, das keine Mehrdeutigkeiten auftreten, z.B. durch LOCK-Anweisungen und/oder Transaktionen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Dragon27

Registriert seit: 20. Nov 2003
Ort: Aßling
543 Beiträge
 
Delphi XE6 Enterprise
 
#5

Re: Programmablauf synchron? [Verständnisfrage]

  Alt 31. Aug 2009, 11:56
Hallo,

danke für die viele Antworten.

Also ich benutze AbsoluteDB und keinen DB-Server . Ich schaff es bis heute nicht, auf einen MySQL-Server zuzugreifen.

Ich glaube, dass AbsoluteDB keine Anfragen paralell ausführen kann, oder? Ist ja nur eine Datei...

Danke
Delphi is ......... DELPHI!!
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Programmablauf synchron? [Verständnisfrage]

  Alt 31. Aug 2009, 18:07
Zitat von Dragon27:
Ich glaube, dass AbsoluteDB keine Anfragen paralell ausführen kann, oder? Ist ja nur eine Datei...
Damit hat das nichts zu tun, MSSQL hat auch nur eine Datei (ok, und eine für die Logs). Das Problem ist:

Prozess A will in einer Tabelle einen Wert um eins erhöhen, Prozess B will das auch (die gleiche Stelle).
A liest den Wert (z.B. x=10), erhöht ihn (x=11). Weiter kommt er nicht, denn B will auch mal. B liest also (x=10) und erhöht ihn (x=11).
Nun ist A wieder dran und speichert die 11. B tut das auch und alle sind zufrieden. Alle? Also ich nicht.

Wenn A nun seine ganze 'Transaktion' exklusiv ausgeführt oder wenigstens die Tabelle gesperrt hätte, dann wäre ich zufrieden:
A sperrt die Tabelle, liest den Wert (z.B. x=10), erhöht ihn (x=11). Weiter kommt er nicht, denn B will auch mal. B will also lesen, darf nicht und sagt 'na gut, ich warte, bis die Tabelle wieder frei ist'.
Nun ist A wieder dran und speichert die 11 und entsperrt die Tabelle. B wacht auf, liest (x=11) und erhöht (x=12) und speichert. So sieht das schon besser aus.

Zu deiner Frage:

Entweder sorgst Du dafür, das aus deinem Programm nur streng sequentiell Operationen auf den Daten durchgeführt werden, oder Du machst das parallel (was u.U. weeesentlich schneller ist), kapselst deine Transaktionen aber. Dafür gibt es in so gut wie jedem DBMS, vermutlich auch ADS, entsprechende Mechanismen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Dragon27

Registriert seit: 20. Nov 2003
Ort: Aßling
543 Beiträge
 
Delphi XE6 Enterprise
 
#7

Re: Programmablauf synchron? [Verständnisfrage]

  Alt 31. Aug 2009, 21:31
Hallo,

danke für deine Antwort. Ja AbsoluteDB hat einen Mechanismus bei dem man entweder Multiuser oder Einzeluser einstellen kann. Meine Idee wäre nun, dass bei Schreibzugriffen das ganze immer in eine stringlist gespeichert wird und dann vom Programm nacheinander abgearbeitet wird. Was haltet Ihr davon?

Danke!
Delphi is ......... DELPHI!!
  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 16:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz