sqldb: nach close() trotzdem noch eine offene transaktion!?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

sqldb: nach close() trotzdem noch eine offene transaktion!?

Beitrag von Leberecht »

hallo,

habe ein problem bei der verwendung der sqldb-komponenten, um auf eine sqlite3-db zuzugreifen, genauer gesagt mit der TSQLQuery-Komponente. es funktioniert eigentlich alles wie es soll bis auf folgendes:
wenn ich über TSQLQuery eine select-abfrage absetze (mit .open), und nach verarbeitung des inhalts die query-komponente mit close() schliesse, ist danach trotzdem eine transaktion offen, also meine TSQLTransaction-komponente hat ein Active=True. ich möchte mit diesem select-befehl nur auf ein read-only dataset zugreifen, ich will nichts darin ändern, nur lesen. möglicherweise habe ich zuwenig parameter übergeben um ihm genau das mitzuteilen. hier mein pseudo-code der bis auf das transaktionsdetail funktioniert:

Code: Alles auswählen

// objekte erzeugen
    sqlCon:=TSQLite3Connection.CREATE(nil);
    sqlTra:=TSQLTransaction.CREATE(nil);
    sqlQry:=TSQLQuery.CREATE(nil);
 
    // objekte initialisieren und db-verbindung herstellen
    sqlCon.DatabaseName:='/meinedb.db3';
    sqlTra.DATABASE:=sqlCon;
    sqlQry.DATABASE:=sqlCon;
    sqlCon.Connected:=True;
 
    IF sqlTra.Active=True then showmessage('vorher: active');        //feuert nicht -gut
 
    sSQL:='SELECT * FROM tabelle;';
    sqlQry.SQL.Text:=sSQL;
    sqlQry.ReadOnly:=True;              //bewirkt nichts, transaktion nachher trotzdem noch offen
    sqlQry.Open;
    showmessage( sqlQry.FieldByName('Feldname').AsString );
    sqlQry.Close;
 
    IF sqlTra.Active=True then showmessage('nachher: active');      //feuert -schlecht
wenn ich mit TSQLQuery insert, update, delete oder alter table über
.ExecSQL;
.Commit;
ausführe, ist die transaktion danach auch korrekt beendet und sqlTra.Active=False. nur bei select´s über die .open-methode nicht. weiss jemand woran das liegen kann, bzw. welche parameter ich vergessen habe?

danke.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: sqldb: nach close() trotzdem noch eine offene transaktion!?

Beitrag von Christian »

SQLite unterstützt nur eine offene Transaktion bzw eine offen Transaktion bei SQLite erzeugt auf jeden fall einen Lock auf die gesamte DB.
Ich weiss nicht wie SQLDB das umsetzt aber lies lieber ohne Transaktion.
Beim schreiben machts bei mehreren SQL Commands natürlich wieder sinn bzw wenn man evntl ein Rollback brauchen kann.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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: sqldb: nach close() trotzdem noch eine offene transaktion!?

Beitrag von mse »

Falls du nicht auf Lazarus angewiesen bist, kannst du auch SQLDB aus MSEide+MSEgui verwenden.
tsqlite3connection benützt standardmässig implizite Transaktionen. Explizite Transaktionen können mit der Option
tslo_transactions aktiviert werden. tmsesqltransaction hat auch die Option tao_fake um mit allen unterstützten Datenbanken mit impliziten Transaktionen arbeiten zu können.
Original-FPC-SQLDB schliesst alle mit einer TSQLTransaction verbundenen datasets beim Inaktivieren der Transaktion. Falls das nicht stört, können die TSQLTransaction-Komponente und die verbundenen datasets auch durch
<deineTSQLTransactioninstanz>.active:= false;
geschlossen werde.
MSEgui tsqldataset hat zusätzlich die Möglichkeit der Abkoppelung von der Datenbank nach dem Laden der Daten. Die Transaktion und die Datenbankverbindung können danach geschlossen werden ohne dass das dataset geschlossen wird.

Martin

Antworten