Wie nehme ich den Lock einer DB weg ?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Wie nehme ich den Lock einer DB weg ?

Beitrag von corpsman »

Guten Morgen allerseits,

Ich bastle hier so eine Kleine Anwendung, welche fleißig mit einer SQL Lite3 Datenbank Kommuniziert.

Dazu habe ich die beiden Routinen geschrieben :

Code: Alles auswählen

 
Procedure TForm1.Query(Query: String); // Stellt eine Query in der DB, danach kann die DB ausgelesen werden.
Begin
  SQLQuery1.Active := false;
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Text := Query;
  Try
    SQLQuery1.Open;
  Except
    On e: Exception Do Begin
      showmessage(format('Error could not execute query'#13#10'Errorcode : %s', [e.Message]));
    End;
  End;
End;
 
Procedure TForm1.ControlQuery(Query: String); // Stellt eine Verwaltungs Query in der DB, danach kann die DB ausgelesen werden.
Begin
  SQLQuery1.Active := false;
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Text := Query;
  Try
    SQLQuery1.ExecSQL;
    SQLTransaction1.Commit;
  Except
    On e: Exception Do Begin
      showmessage(format('Error could not execute controlquery'#13#10'Errorcode : %s', [e.Message]));
    End;
  End;
End;
 


Das Funktioniert auch alles wunderbar. Nun will ich aber das 2 unterschiedliche Instanzen meiner Anwendung Abwechselnd schreibend auf meine Datenbank zugreifen können. Dazu muss die erste Instanz den "Lock" auf die Datenbank auch irgendwie wieder frei geben, nur weis ich nicht wie.
Könnt ihr mir hier ein wenig weiter helfen ?
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von corpsman »

So wenn ich nach jedem Abarbeiten einer Query ein

Code: Alles auswählen

  SQLTransaction1.Active := false;   


mache dann gehts, aber ist das auch sauber ?
--
Just try it

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von Patito »

Ich selber verwende jetzt kein SQLite, aber normalerweise sollte ein Active := False beim Query reichen.
Ich verwende aber anstatt Query.Active immer nur Query.Open() und Query.Close().

Bei der Transaktion vermisse ich bei Dir noch irgendwo ein StartTransaction().

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von Soner »

Zwei Programme können nicht gleichzeitig Änderung bei eine Datenbank machen. Deshalb würde ich nach jede Änderung DB-Schließen und neu öffnen wie du es machst. Hier steht mehr darüber:
http://www.sqlite.org/faq.html#q5

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von corpsman »

ein Query.Active := false hatte nichts gebracht, deswegen hatte ich ja immer die Transaktion deaktiviert.

So viel ich weis ruft das setzen von active die Open und close geschichten auch irgendwie auf.
--
Just try it

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von hde »

Warum nimmst du SQLite wenn du von mehreren Ecken aus auf die Daten zugreifen willst?
Soweit ich das weiß ist SQLite KEIN Datenbankserver und nur für Singlezugriff geeignet?
Warum setzt du nicht auf einen Datenbakserver der das kann was du möchtest?
Oder was sagen die SQLite Spezies hier?
Gruß hde

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von af0815 »

Es steht in der FAQ von Sqlite auch eindeutig drinnen, das sie nicht einmal Threadsafe ist. Eine Lösung wäre, den Zugriff auf die DB von einem Programm zu machen (somit Single) und beliebige Programeme nur Über das eine Programm zu machen. Oder wie bereits angesprochen, die passende DB zu nehmen.

Ich kann ja auch nicht erwarten das ein In der Stadt flotter Kleinwagen, auf der Rennstrecke gute Figur macht. Außer ich suche mir die richtige Strecke.

Das ist auch einer der Unterschiede zwischen Desktop und Serverdatenbanken.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von corpsman »

Nun das tolle an SQLLite ist doch, dass man nichts installieren braucht, einfach ne Dll ins Anwendungsverzeichniss und gut.

Die Semaphoren drum rum, da habt ihr alle Recht, die sollte man dann schon selbst machen, oder eben auf ein richtiges Pferd setzen. Zum ein bischen rumspielen ( und mehr macht meine Anwendung eigentlich nicht ) reicht das SQLLite alle mal. Wenn ich die Threads zum Thema Datenbanken hier richtig verstehe, dann kann man die eigentlichen DB Komponenten auch relativ einfach austauschen. Zumindest wenn die Datenbanken nicht mehr wie Primär und Fremdschlüssel nutzen, so was wie Trigger und den ganzen Zusatz blimbim habe ich nicht.

An anderer Stelle habe ich das SQLLite als single Instanz eingesetzt und kann sagen da schlägt es sich sehr gut...
--
Just try it

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von hde »

corpsman hat geschrieben:Nun das tolle an SQLLite ist doch, dass man nichts installieren braucht, einfach ne Dll ins Anwendungsverzeichniss und gut.

Das sollte ggf. mit anderen Datenbanken auch gehen.
SQLite ist für Single-Anwendungen wohl gut, aber eben nur für Single.
af0815 hat geschrieben: Eine Lösung wäre, den Zugriff auf die DB von einem Programm zu machen (somit Single) und beliebige Programeme nur Über das eine Programm zu machen

auch das wäre eine Lösung.
corpsman hat geschrieben:kann man die eigentlichen DB Komponenten auch relativ einfach austauschen.

Da weicht die Realität von der Theorie leider ab da SQL (leider) doch viel "Dialekte" hat und damit Änderungen am Code meist doch nötig sind.
Also besser vorher nachdenken wohin man will als den fahrenden Zug später mühsam umzuleiten.
hde

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von corpsman »

Das sollte ggf. mit anderen Datenbanken auch gehen.

Konkrete Plattformunabhängige Beispiele ?
--
Just try it

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von mse »

hde hat geschrieben:Warum nimmst du SQLite wenn du von mehreren Ecken aus auf die Daten zugreifen willst?
Soweit ich das weiß ist SQLite KEIN Datenbankserver und nur für Singlezugriff geeignet?

Das ist nicht richtig. SQLite3 verwendet file locks um den Mehrbenutzerzugang zu organisieren und lässt sich für eine kleine Anzahl von Nutzern die nur kurz schreibend auf die Datenbank zugreifen gut verwenden, falls die Komponentenbibliothek die SQLite3 Eigenheiten berücksichtigt. MSEgui tsqlite3connection tut dies.

Martin

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von khh »

welch "vernünftigen Grund" ausser der nicht nötigen sep. Installation , gibt es die light-version zu benutzen ?

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von Patito »

khh hat geschrieben:welch "vernünftigen Grund" ausser der nicht nötigen sep. Installation , gibt es die light-version zu benutzen ?


Ein Grund SQLite zu verwenden ist die zunehmende Verbreitung. Bei Android ist es z.B. einfach schon dabei.
Das wird vermutlich wie bei PHP und MySQL dafür sorgen, dass man es bald nicht mehr los wird und man
überall Clients-Libraries nachgeschmissen bekommt.

Ich weiss nicht wie es jetzt ist, aber vor einiger Zeit war es z.B. mit Lazarus eher eine ziemliche Bastelaufgabe wenn man
nur einen simplen PostGres-Client unter WinCE haben wollte.

Für mehr als eine Embedded-Datenbank taugt SQLite eigentlich nicht, aber bis man z.B. einen PostGres
auf einem Raspberry Pi oder einem Android installiert hat, ist Weihnachten vermutlich vorbei...

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von m.fuchs »

khh hat geschrieben:welch "vernünftigen Grund" ausser der nicht nötigen sep. Installation , gibt es die light-version zu benutzen ?

Ich benutze das ganz gerne für die Speicherung von komplexen Daten. Für ein CMS lege ich zum Beispiel alle Daten eines Projekts (Seiten, Styles, Skripte, etc.) in einer Sqlite-Datei ab. Dazu habe ich einen kleinen OR-Mapper, der mir die Ergebnisse einer SQL-Abfrage direkt in Objekte wandelt. Ist wunderbar schnell und macht die Abfrage einfach.

Für Multi-Client-Anwendungen würde ich es aber auch nicht einsetzen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Wie nehme ich den Lock einer DB weg ?

Beitrag von Patito »

Nochmal zurück zum Lock-Problem.

Die Queries zu deaktivieren sollte bei einer normalen DB reichen um alle störenden Locks und Cursor zu entfernen.
Bei SQLite würde ich aber zur Sicherheit die ganze Connection abschalten.

SQLiteConnection.Connected = False

Ich habe mal eine nette Anekdote von einem Turnier-Statistik-Server gehört, wo jemand dachte er könne von
einer Anwendung über 2 Threads gleichzeitig lesend auf eine SQLite-Datenbank zugreifen. Das ganze ging nicht gut...

Antworten