Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Exklusiver Zugriff auf Datenbank via MySQL (https://www.delphipraxis.net/93042-exklusiver-zugriff-auf-datenbank-via-mysql.html)

TypusMensch 30. Mai 2007 17:35

Datenbank: MySQL • Version: 5.0 • Zugriff über: Zeoslib

Exklusiver Zugriff auf Datenbank via MySQL
 
Hallo,

Ich stelle mir gerade die Frage wie ich unter MySQL und Delphi32 mittels Zeoslib-Komponenten den exklussiven Zugriff steuern kann.

Beispiel:
User greif auf DB zu, Daten werden in einem Dialog eingelesen. Er hat nun die Möglichkeit diese zu verändern und dann abzuspeichern, alternativ >>abbrechen<<.

Ein andere User aus dem Netzwerk greift nun auf DB-Eintrag zu. Die Daten werden eingelesen. Genau in dem Moment greift der andere User auf den selben Eintrag zu. Welcher nun zuletzt speichert, dessen Daten gelten als geschrieben. Die anderen verliert die Datenbank doch (?). Oder hat MySQL intern eine "Sperre"?

Timeline (parallel):

User a) |--ZUGRIFF---------------------------------SCHREIBEN------|
User b) |----------ZUGRIFF--------SCHREIBEN-----------------------|

Nun überschreibt User a die Daten, die User b gerade erst geschrieben hat.
Wie also kann ich feststellen ob User a akutell den einen Eintrag bearbeitet bzw. auf einen einzelnen Eintrag zugreift, um den zweiten "warten zu lassen"?

MfG

mkinzler 30. Mai 2007 17:46

Re: Exklusiver Zugriff auf Datenbank via MySQL
 
Verwende eine transaktionsfähige Storage-Engine.

shmia 30. Mai 2007 17:55

Re: Exklusiver Zugriff auf Datenbank via MySQL
 
Was würde passieren, wenn User A mit Editieren beginnt und dann in die Mittagspause geht, während User B verzweifelt (*) versucht, den Datensatz zu ändern und nicht darf ?!!
(*) User B muss den Auftragsstatus ändern und das Angebot abschicken oder der Millionenauftrag geht an die Konkurrenz.
Deshalb fährt man mit der Strategie "wer zuletzt speichert hat gewonnen" besser.
Man kann auch Transactions (aber nicht bei MySQL) verwenden;
damit wird garantiert,dass Änderungen an der Datenbank (auch an mehreren Tabellen) vollständig ausgeführt oder komplett rückabgewickelt werden.

mkinzler 30. Mai 2007 17:57

Re: Exklusiver Zugriff auf Datenbank via MySQL
 
Zitat:

Man kann auch Transactions (aber nicht bei MySQL) verwenden;
Kommt darauf an, ob die verwendete Storage-Engine das unterstützt.

DGL-luke 30. Mai 2007 17:58

Re: Exklusiver Zugriff auf Datenbank via MySQL
 
Hat MySQL nicht inzwischen einen transaktionsfähigen Datenbanktyp?

himitsu 30. Mai 2007 18:21

Re: Exklusiver Zugriff auf Datenbank via MySQL
 
Ohne Transaktionen wäre doch sowas wie die RedBox hier im Forum recht praktisch.

Also vorm Speichern prüfen, ob zwischenzeitlich was geändert wurde und dann Rückfragen, oder der User (A) die Änderungen vom anderem User (B) überschreiben will.

mkinzler 30. Mai 2007 18:22

Re: Exklusiver Zugriff auf Datenbank via MySQL
 
Locking funktioniert unabhängig ob Transaktionen unterstützt werden oder nicht.

TypusMensch 30. Mai 2007 21:45

Re: Exklusiver Zugriff auf Datenbank via MySQL
 
Zitat:

Zitat von himitsu
Also vorm Speichern prüfen, ob zwischenzeitlich was geändert wurde und dann Rückfragen, oder der User (A) die Änderungen vom anderem User (B) überschreiben will.

Das macht Sinn. Auf die Idee bin i noch gar nicht gekommen. :)

Jelly 31. Mai 2007 06:16

Re: Exklusiver Zugriff auf Datenbank via MySQL
 
Nutze Transaktionen, denn dafür sind die da, anstatt eigenhändig auf Änderung von Datensätzen zu prüfen. Der transaktionsfähige Tabellentyp unter MySQL heisst übrigens InnoDb. Einfach mal danach in der Help nachlesen.

Phoenix 31. Mai 2007 07:13

Re: Exklusiver Zugriff auf Datenbank via MySQL
 
Was sich bewährt hat:
In jeder Tabelle ein Feld einfügen: LastChanged. Das wird immer durch den aktuellen Timestamp beim Speichern gefüllt.

Somit weiss Deine Anwendung genau, wann der Datensatz der aktuell in Bearbeitung ist das letzte mal geändert wurde. Du kannst nun beim Speichern den Datensatz nochmal selektieren (where LastChanged > MyCurrentLastChanged). Bekommst Du nichts zurück hat sich nichts geändert und Du kannst gefahrlos speichern ohne Änderungen zu überbügeln. Kommt jedoch ein Datensatz zurück kannst Du dem User sagen: "Hey, da hat sich was geändert. Willste weiter machen oder die neuen Daten erst nochmal angucken?".


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