phpbar.de logo

Mailinglisten-Archive

Re: Locks
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Locks



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 


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive