Verwendung von rdb$db_key

Forum zu diversen Themen rund um die Firebird-Programmierung

Moderator: martin.koeditz

Antworten
zappa2
Beiträge: 30
Registriert: Fr 5. Okt 2018, 10:59

In einer alten Bestandsdatenbank habe ich teilweise 5 Felder (davon 3 String-Felder!) als PrimaryKeys.

Das Datenmodell würde ich als ziemlich fragwürdig bezeichnen, soll jetzt aber nicht weiter interessieren.

Im Rahmen der Programmierung habe ich so einige for-select-Durchläufe, bei denen ich in Subroutinen diverse Updates auf diese Datensätze ausführe, und zwar auch auf Datenfelder, die Bestandteil des PK sind.

Soviel ich weiß, ist doch innerhalb einer Session (Connection) rdb$db_key in jeder Tabelle eindeutig. Allerdings habe ich zu meinem Erschrecken festgestellt, dass rdb$db_key nach einem Update nicht mehr den gleichen Inhalt hat.

Wo liegt hier mein Denkfehler?

Ist rdb$db_key doch nicht eindeutig innerhalb einer aktiven Connection oder wird er dynamisch in Abhängigkeit des PK geändert? So jedenfalls ist er für mich nicht zu gebrauchen.

Nachtrag: Ich will wegen der Handlichkeit rdb$db_key als Pseudo-PK nutzen, um nicht 5 Felder in die Subroutinen übergeben zu müssen.
Benutzeravatar
martin.koeditz
Beiträge: 374
Registriert: Sa 31. Mär 2018, 14:35

Der rdb$db_key ist in jedem Falle eindeutig innerhalb einer Transaktion. Dies hat etwas mit der Isolierung gegenüber anderen Transaktionen zu tun.

Datenbankintern wird durch den rdb$db_key die Adresse des Datensatzes gekennzeichnet. Der Primärschlüssel liegt hingegen im Speicher (Datenbank-Seite) und verweist auf den passenden rdb$db_key. Aus diesem Grunde ist die direkte Ansprache mittels rdb$db_key immer schneller als über einen Index.

Durch die Manipulation wird eine neue Version (rdb$record_version) des Datensatzes erstellt. Die Adresse sollte beim Update aber erhalten bleiben. Dies gilt jedoch nur innerhalb der Transaktion. Danach kann sich diese durch äußere Einflüsse jederzeit ändern.

Gruß
Martin
Martin Köditz
it & synergy GmbH
zappa2
Beiträge: 30
Registriert: Fr 5. Okt 2018, 10:59

Besten Dank für die Ausführungen.
Aber wie bereits erwähnt, gilt der rdb$db_key nach einem update innerhalb einer SP nicht mehr. Also definitiv gleiche Transaction.
bfuerchau
Beiträge: 383
Registriert: Mo 7. Mai 2018, 18:09

Nur mal ne Frage: Bist du sicher dass du eine Transaktion explizit startest oder verwendest du ggf. Autocommit?
Verwendet die SP ggf. eine eigene Transaktion?
Antworten