Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programmablauf synchron? [Verständnisfrage] (https://www.delphipraxis.net/139522-programmablauf-synchron-%5Bverstaendnisfrage%5D.html)

Dragon27 30. Aug 2009 20:29


Programmablauf synchron? [Verständnisfrage]
 
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!

Phoenix 30. Aug 2009 20:39

Re: Programmablauf synchron? [Verständnisfrage]
 
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.

Sir Rufo 30. Aug 2009 21:12

Re: Programmablauf synchron? [Verständnisfrage]
 
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 :mrgreen:

cu

Oliver

alzaimar 31. Aug 2009 07:14

Re: Programmablauf synchron? [Verständnisfrage]
 
Zitat:

Zitat von Sir Rufo
Wegen dem SQL-Server brauchst du dir keinen Kopf machen, der führt die Abfragen nacheinander aus :mrgreen:

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.

Dragon27 31. Aug 2009 10:56

Re: Programmablauf synchron? [Verständnisfrage]
 
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 ;-)

alzaimar 31. Aug 2009 17:07

Re: Programmablauf synchron? [Verständnisfrage]
 
Zitat:

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.

Dragon27 31. Aug 2009 20:31

Re: Programmablauf synchron? [Verständnisfrage]
 
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!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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