![]() |
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 ![]() |
Re: Datensatzsperre und refresh in MySql-Datenbank
Danke für eure Beiträge, insbesondere Bernhard und Barnti. Mir ist mittlerweile die Sperrlogik mit InnoDB klar geworden.
Was ich bis jetzt noch immer nicht gecheckt habe, ist, wie ich möglichst komfortabel (zB mit DB-Navigator) durch eine Tabelle blättern kann und mich verlassen kann, dass die Daten immer aktuell sind (siehe meine vorige Anfrage ein refresh bei jeder Datensatzänderung scheint mir nicht zweckmäßig). Ich hoffe, euch nicht zu sehr zu nerven! |
Re: Datensatzsperre und refresh in MySql-Datenbank
Hallo!
Vielleicht solltest Du einfach soetwas wie ein DATENBANK verwenden :zwinker: Wenn Du in ein Standardlehrbuch über DBs (wie zB Herder/Rahm, Heuer/Saake oder Date) schaust, wirst Du Transaktionsverwaltung sowie Synchronisation verschiedener Benutzer als Anforderungen an eine DB finden. mySQL bietet dies nicht und auch mit dem Tabellentypen Inno-DB gibt es solch Merkwürdigkeiten wie die WARNUNG "Incomplete rollback" - nun ja, wer so etwas Transaktionen nennen will... :stupid: Angesichts derartiger Defizite ist es schon erstaunlich, dass mySQL vielfach unter der Rubrik Datenbanken aufgeführt wird - man gewinnt den Eindruck, daß die Autoren nicht wissen, was unter einer Datenbank zu verstehen ist - die Abfragesprache SQL ist jedenfalls weder notwendig noch hinreichend hierzu. Gleichwohl hat mySQL natürlich seine Berechtigung, wenn es lediglich darum geht zB von PHP aus schnell auf die (sicht nicht oder nur selten ändernden) Daten für eine WebSeite zugreifen so wollen. Bloß sollte man mySQL dabei immer eher als Spielzeug, denn als richtige DB betrachten. All das, was Du bei einer richtige DB "geschenkt" bekommst, mußt Du Dir bei mySQL in der Anwendungslogik selbst zusammenprogrammieren... :pale: Viele Grüße vom SQLTiger |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 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