![]() |
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! |
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. |
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 |
Re: Programmablauf synchron? [Verständnisfrage]
Zitat:
|
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 ;-) |
Re: Programmablauf synchron? [Verständnisfrage]
Zitat:
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. |
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 23:05 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