Mailinglisten-Archive |
Hallo
Dieter Spiess schrieb:
> Ich arbeite jetzt mit kooperativem Locking
> allerdings in Delphi so:
>
> {--------------------------------------------------------------------}
> function GetLock(Tabname:string):boolean;
> {Kooperatives Lock einrichten: Nicht die Tabelle wird gesperrt
> sondern nur die Zeichenkette, die allerdings vereinbarungsgemäß
> die Tabelle repräsentieren kann. (dubois S.654)}
> var AQu:TMySQLQuery;
> begin
> AQu:=TMySQLQuery.Create(NIL);
> result:=false;
> With AQu do
> begin
> Database:=SVWForm.SVWDatabase;
> Close; SQL.Clear;
> SQL.Add('select get_lock("'+Tabname+'",0)');
> Open;
> if Fields[0].AsInteger=1 then result:=true;
> Close;
> end;
> AQu.Free;
> end;
> {--------------------------------------------------------------------}
> function ReleaseLock(Tabname:string):boolean;
> {Kooperatives Lock freigeben}
> var AQu:TMySQLQuery;
> begin
> AQu:=TMySQLQuery.Create(NIL);
> result:=false;
> With AQu do
> begin
> Database:=SVWForm.SVWDatabase;
> Close; SQL.Clear;
> SQL.Add('select release_lock("'+Tabname+'")');
> Open;
> if Fields[0].AsInteger=1 then result:=true;
> Close;
> end;
> AQu.Free;
> end;
> {--------------------------------------------------------------------}
>
> Der zweite Client erhält beim Aufruf von GetLock auf den
> gleichen String bei obiger Funktion "false" zurück.
> Er kann aber weiterhin lesen und schreiben.
> Der Programmierer entscheidet im Client, ob er darf.
> Vielleicht hilfts dir ja auch.
> Vielleicht kennt jemand noch eine bessere Lösung.
>
> --
> Gruß
> Dieter Spieß
Hallo,
ich arbeite ebenfalls mit Delphi. Im Unterschied zu obiger Lösung setze
ich keinen Lock auf die Tabelle, sondern direkt auf den einzelnen
Datensatz, der geändert oder gelöscht werden soll; andere Datensätze
in der gleichen Tabelle können von anderen Clients bearbeitet werden.
function TDataModule1.SetLock(const wen:string):Boolean;
begin
result := false;
with quUpdate do
begin
SQL.clear;
SQL.Add('select get_lock("'+wen+'",0)');
{wen = Schlüsselnummer des Datensatzes}
Open;
if Fields[0].AsInteger=1
then result:=true;
Close;
end;
end;
function TDataModule1.UnSetLock(const wen:string):Boolean;
begin
result := false;
with quUpdate do
begin
SQL.Clear;
SQL.Add('select release_lock("'+wen+'")');
{wen = Schlüsselnummer des Datensatzes}
Open;
if Fields[0].AsInteger=1
then result:=true;
Close;
end;
end;
Da ich mit Sperren auf Tabellen nicht gearbeitet habe, weiß ich nicht,
ob meine Lösung besser ist. Ich denke, auf der gesperrten Tabelle kann
nicht mehr gearbeitet werden - oder seh ich das falsch?
Das Arbeiten mit der gleichen Tabelle ist beim Sperren auf
Datensatzebene immer noch möglich. Außerdem kann ich beim ändernden
Zugriff eines anderen Clients eine eindeutige Meldung ausgeben, welcher
Datensatz gerade von einem anderen Nutzer bearbeitet wird.
Grüße
Jürgen Schneider
---
*** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive