![]() |
Datensatzsperre und refresh in MySql-Datenbank
Hallo,
ich habe (als MySql-Neuling/ mySql 4.1 am localhost , ZEOS-Komponenten 6.1) folgendes Problem: Ich habe mehrere DBedits mit einem TQuery verbunden (select * from artikel; requestlive:true). Für die Verbindung zur Datenbank (InnoDB) sind die Einstellungen: Autocommit: true; Transactisolation: tiRepeatableRead; Die Navigation erfolgt mit DBNavigator. 1. Problem: Offenbar wird die gesamte Tabelle in den Arbeitsspeicher geladen. 2.Problem (hängt offenbar mit dem ersten zusammen): Wenn ich Änderungen im Datensatz vornehme, wird der Datensatz offenbar nicht gesperrt (ich habe testweise die gleiche Anwendung noch mal gestartet und kann den gleichen Datensatz in beiden Anwendungen gleichzeitig verändern, ohne einen Hinweis zu erhalten). Externe Änderungen in der Tabelle werden beim normalen blättern in der Tabelle nicht erkannt, sondern erst nach neuerlichem ZQuery.open bzw. explizitem ZQuery.refresh. Benötigen würde ich: Datensatz für Datensatz wird aufgerufen und nicht die ganze Tabelle auf einmal Datensatz wird bei Änderung gesperrt und nach post wieder freigegeben. Danke für eure Hilfe! |
Re: Datensatzsperre und refresh in MySql-Datenbank
Zitat:
Zitat:
Der Standard-Tabellentyp unterstützt keine Transaktionen (und damit Sperrung). Zitat:
|
Re: Datensatzsperre und refresh in MySql-Datenbank
:pale: Danke für deine Antworten, damit scheint mir MySql für eine Client-Server-Anwendung (Auftragsbearbeitung) mit mehreren Usern gleichzeitig nicht wirklich geeignet. Gibts eine Alternative mit serverseitigem Cursor, möglichst frei einsetzbar und auf Linux lauffähig. Würde FB das alles erfüllen?
Peter |
Re: Datensatzsperre und refresh in MySql-Datenbank
Zitat:
|
Re: Datensatzsperre und refresh in MySql-Datenbank
Zitat:
Im CS-Umfeld sind ein paar entscheidungen zu Desktopdatenbanken unterschiedlich zu treffen: - Möglichst kleine Ergebnismengen produzieren - Transaktionen kurz halten - Wenn möglich keine Serverseitigen Curser verwenden Wir selbst setzen MySQL erfolgreich als CS-Datenbank ein (neben MS-SQL und Oracle). |
Re: Datensatzsperre und refresh in MySql-Datenbank
Ich bin mir nicht ganz sicher wie es mit Delphi ist aber per PHP kann man die Ausgabe auf Anfragen zb "select" mit zB. "limit 30" begrenzen.
|
Re: Datensatzsperre und refresh in MySql-Datenbank
Also doch MySQL? Wie gesagt, bin ich ein Newby was MySQL betrifft (und auch echte Client-Server-DB-Anwendungen). :oops: Daher schäme ich mich auch nicht zu fragen, wie ihr den Spagat zwischen "kleiner Datenmenge zurückgeben" und "komfortablem Blättern" (natürlich mit aktuellen Daten) löst.
Für alle Antworten dankbar! |
Re: Datensatzsperre und refresh in MySql-Datenbank
Zitat:
|
Re: Datensatzsperre und refresh in MySql-Datenbank
Ich habe vorerst Folgendes vorgenommen, um online Veränderungen in der DB mitzubekommen (schlagt mich nicht, mir ist bewusst, dass das nicht performance-optimierend ist):
als onklick-Ereignis auf den DB-Navigator führe ich einen refresh auf das TQuery durch (komplett reingeladen ca 10.000 Records) und setze die Tabelle auf Edit wenn sie vor dem Klick Status dbInsert oder dbEdit hatte. Das ist aber eine totale "Pfui"-Lösung (schäm,schäm) ich weiß aber nicht, wie ich's besser machen könnte (Blättern/suchen in der Artikel-Tabelle mit aktuellen Daten). Danke für eure Ratschläge! |
Re: Datensatzsperre und refresh in MySql-Datenbank
Hallo,
wie Bernhard schon bemerkte: Lade die Daten, die benötigt werden. Für das Sperren auf Datensatzebene benutze InnoDB-Tabellen. Um einen Datensatz zu sperren kannst Du dann den betreffenden Record mit:
SQL-Code:
für andere Benutzer sperren.
SELECT DasUndDas,DiesAuch
FROM MeineTabelle WHERE MeineTabelle_ID= BenötigteBedingung FOR UPDATE Mit dem 'FOR UPDATE'-Statement werden dann alle durch das SELECT gelesene Datensätze für den schreibenden Zugriff gesperrt. Ich kann Dir empfehlen erst mal zwei mysql-Verbindungen in zwei Shells zu öffnen. Dann kannst Du mit den Statements zum Sperren experimentieren. Sehr hilfreich ist das zugehörige ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:31 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