Frage zu Locking (Vergabe von Nummern im Nummernkreis)

Forum für neue Firebird-Anwender.

Moderator: thorben.braun

bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Ok, was die Doku angeht so muss tatsächlich bei der FB "with lock" kodiert werden, das mache ich i.Ü. genauso.
"for update" verwende ich bei der DB2/400 :).

Fehler behandle ich hier in der Regel gar nicht, da dies wiederum Sache des Client sein soll (z.B. Lock-Timeout, der eigentlich nicht eintreten sollte).

Was mache ich?

begin in autonomous transaction
Do begin
select first 1 a.lockvalue from zgloballock a with lock into :xvalue
Do begin
execute statement :xcmd;
when any do begin exception; end
end end

In diesem Fall ist "xcmd" das auszuführende SQL wie "create table ...".
Wegen der Fehlerbehandlung funktioniert dies tatsächlich nur mit dem "when any do begin exception; end", da ein auftretender Fehler dann an den Client weitergeleitet wird.
Wird die autonome Transaktion korrekt beendet, gibts einen Commit, ansonsten einen Rollback.
Da ich alle kritischen und konkurierenden SQL's auf diesem Weg ausführe kann es keine Konkunrenz-Fehler mehr geben.
vr2
Beiträge: 214
Registriert: Fr 13. Apr 2018, 00:13

Hallo,

zum Dunstkreis des Threads: auf der Firebird-Seite ist ein guter Artikel über Transaktionen verlinkt:http://firebirdsql.org/en/news/transact ... -firebird/

Es kann sein, dass sich Nebenläufigkeits- und Lockinggeschichten elegant lösen lassen, wenn man sich ein wenig mit Transaktionen befasst.

Grüße, Volker
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Nun, schön das das nun auch Firebird mal erklärt, aber das ist schon ein alter Hut seit es Transaktionen gibt (1983):
https://de.wikipedia.org/wiki/ACID
https://en.wikipedia.org/wiki/ACID_(computer_science)
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Nun, schön das das nun auch Firebird mal erklärt, aber das ist schon ein alter Hut seit es Transaktionen gibt (1983):
https://de.wikipedia.org/wiki/ACID
https://en.wikipedia.org/wiki/ACID_(computer_science)
Das ist schon richtig, aber im Link von ib-aid ist das Transaktionsmodell schon etwas hübscher dargestellt als auf Wikipedia. Außerdem geht der Autor auf die Firebird-spezifischen Aspekte ein. Da kocht jedes System sein eigenes Süppchen.

Gruß
Martin
Martin Köditz
it & synergy GmbH
MyRealName
Beiträge: 1
Registriert: Mi 24. Jul 2019, 13:28

Wenn es nur um einen Cache für Reportdaten geht und man nicht will, dass Nutzer sich gegenseitig die Daten beinflussen, warum dann nicht Global Temporary Tables ?
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Global Temporary Tables (GTT) können nur innerhalb einer Connection konsistent verwendet werden.
Dies macht u.U. Sinn bei komplexeren SP's die sich diverse Daten zusammensuchen und das Endergebnis dann als Cursor auf eine GTT zurückgeben.
Bei Anwendungen mit Connection-Pool's wird es dann kritisch, da man bei vernünftiger Verwendung jede Aktion über den Pool steuert.
Somit ist nicht gewährleistet, dass mit dem nächsten SQL die gefüllte GTT noch da ist oder überhaupt noch dieselbe ist.
Dies muss schon sehr genau konzipiert werden, was z.B. bei Web-App's (viele User, viele Sitzungen, wenige parallele Verbindungen durch Pooling) dann aber zeitkritsich werden kann.
Desweiteren belasten GTT's die TEMP-Arbeitsbereiche, da sie inhaltlich nicht in der DB liegen. Hier ist ggf. auf dem Systemlaufwerk (bzw. firebird.conf) dann für ordentlich Platz zu sorgen.
Ich hatte mal mit einem falschen SQL (Entwickler) einen Cross-Join definiert, der mir ordentlich die Platte zumüllte.
Antworten