Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Gleichzeitiger Zugriff auf MySQL DB... (https://www.delphipraxis.net/27992-gleichzeitiger-zugriff-auf-mysql-db.html)

kico 18. Aug 2004 10:34


Gleichzeitiger Zugriff auf MySQL DB...
 
Habe ein kleines Problem mit meiner MySql Datenbank und die gleichzeitige Verwendung einer Tabelle durch 2 (oder mehrer User).

Situation:
ein DB Grid zeigt mir eine Artikelliste, bei doppelklick auf einen Artikel werden mir details zum artikel zur bearbeitung (Datensatz wird dabei mit .edit angesprochen) in einem neuen Fenster angezeigt. Beim schliessen des Fensters werden die daten wieder gepspeichert (.post). Soweit so gut.

Problem:
Sobald ein anderer User mein Programm geöffnet hat und sich "nur" die Artikelliste anzeigen lässt (keinen Datensatz bearbeitet) und ein weiter user versucht einen artikel zu ändern hängt mein programm beim .post
d.h. die tabelle scheint irgendwie komplett gesperrt zu sein.

Umwelt:
Ich benutze Delphi 7, MySQL, CoreLab MyDAC (zum direkten ansprechen der DB)

Bernhard Geyer 18. Aug 2004 10:59

Re: Gleichzeitiger Zugriff auf MySQL DB...
 
Kann bei MySQL eigentlich nicht der Fall sein:

1, Unterstützt nur bei InnoDB-Tabellen Transaktionen
2, Unterstützt das Muli-Versions-Konzept. D.h. Ein Schreibopteration kann keine Leseoperationen blockieren.

Kannst Du etwas Code posten bzw. ein Minimalbeispiel bereitstellen, wo dieses Verhalten auftritt.

kico 21. Aug 2004 10:41

Re: Gleichzeitiger Zugriff auf MySQL DB...
 
habe mal das problem weiter eingeschränkt...

ich benutze die MyDAC Komponenten von Corelab um MySQL anzusprechen. dort gibt es die Komponente MyQuery und MyTable. MyQuery setzt ein normales Query ab und gibt mir einen Result. MyTable gibt mir die komplette Tabelle (sehr praktisch: man kann mit filtern die erbenismenge eingrenzen usw.) Ich habe bei meinen DBGrid als Source die MyTable Komponente benutzt und die scheint mir die komplette Tabelle für schreibzugriffe zu sperren. Benutzte ich hingegen ein (My)Query funktioniert es einwandfrei.

Die Komponente MyTable besitzt die Eigenschaft readonly die auch brav auf enable steht...in der Dokumentation habe ich auch nichts gefunden...

Die Frage an euch: kennt sich jemand mit den Koponenten von CoreLab aus und hat eine Lösung für mich (habs halt jetzt mit Querys gemacht ist aba nicht so schön ... siehe Filter)

Bernhard Geyer 21. Aug 2004 10:48

Re: Gleichzeitiger Zugriff auf MySQL DB...
 
Core-Labs komponenten kenne ich nur Testweise (Haben andere im Einsatz).

Ich würde grundsätzliche keine TTable-Komponente verwenden und bei den TQuery-Komponenten schon die SQL-Anweisungen so absetzen, das nur eine minimale Datenmenge vom Server zum Client geliefert werden muss. Filter ist zwar recht necht, aber nur für Desktop-Datenbanken zu empfehlen. Für SQL-Server-Datenbanken kann sich dies (bei entsprechender Datenbankgröße) als Performance-Killer erweisen (vor allem bei MySQL, wo es keine Serverseitigen Curser gibt).

ahenne 21. Aug 2004 12:02

Re: Gleichzeitiger Zugriff auf MySQL DB...
 
Hallo kico !

Wenn ich das recht verstehe, tritt das Problem auf, wenn der erste Benutzer die Tabelle in den Edit-Modus versetzt und der dritte dann auch versucht, die Tabelle zu editieren.

Das kannst Du doch ganz einfach abfangen, indem Du in der Ereignisbehandlung von CRDBGrid1.OnDblClick einträgst:
Delphi-Quellcode:
If MyTable1.State=dsBrowse // Ist die Tabelle im Lese-Modus
Then MyTable1.Edit;

If MyTable1.State=dsEdit // Ist die Tabelle schon im Edit-Modus
Then {Benutzer darf jetzt nicht schreiben, weil das schon ein anderer tut}
Ich selbst benutze MyTable nur zum Anzeigen und Filtern, für das Ändern benutze ich UPDATE-Statements mit MyQuery. Damit ist die Tabelle nur Sekundenbruchteile gesperrt.

Hoffe, das war hilfreich.

Lg
Andreas

kico 23. Aug 2004 15:24

Re: Gleichzeitiger Zugriff auf MySQL DB...
 
Danke für eure bemühungen...habe das Problem jetzt gelöst:

ich deaktiviere einfach mein DBgrid (eigentlich MyTable.active := false)
dann sende ich mein UPDATE des Datensatzes und dannach aktiviere ich wieder mein grid, bzw meine Table

jetzt funktionierts :-D


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