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