Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird Transaction lange offen (https://www.delphipraxis.net/186853-firebird-transaction-lange-offen.html)

Gruber_Hans_12345 6. Okt 2015 18:39

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX

Firebird Transaction lange offen
 
Hallo

Ich wollte mal fragen, mit welchen Parametern ist es sinnvoll eine Transaktion zu starten die nur lesen ist, aber dafür sehr lange offen sein kann.
Speziell für Auswertungen eben (Reports, Pivot usw)

Ich möchte damit eben mein System nicht verlangsamen, meine schreibenden und sonstigen Transactionen sind immer extrem kurz, nur eben diese können teils auch mal tage offen beleiben (sollte nicht sein, aber es kann passieren)

Zugriff ist noch per IBX

besten danke

mkinzler 6. Okt 2015 19:00

AW: Firebird Transaction lange offen
 
Warum muss dann die Transaktion tagelang offen bleiben?

Gruber_Hans_12345 7. Okt 2015 05:37

AW: Firebird Transaction lange offen
 
müssen nicht aber es passiert halt

Das sind zum teil fremdkomponenten die auf die Datenbank zugreifen, und eben die Daten direkt aus der TIBQuery auslesen, und es muss bei IBX die Transaktion offen bleiben, sonst sind ja die Daten weg.

Daher müsste ich entweder eine zwischenschicht einführen, die die daten kopiert, oder die Komponente müsste sich die Daten selber kopieren.

Es handelt sich hier im Report Builder, und eine Pivot Komponente - und wenn der user eben die Fenster offen lässt bleibt auch die Transaktion offen.

Perlsau 7. Okt 2015 06:37

AW: Firebird Transaction lange offen
 
Ich vermute stark, du verwechselst hier was: Nicht die Transaktion bleibt offen, sondern das Query bleibt aktiv (Active = True). Die Transaktion kann gar nicht offenbleiben, nachdem die Daten via select von der Datenbank angefordert wurden und eingetroffen sind. Wäre die Transaktion noch offen, würde der Select-Befehl noch auf seine Ausführung warten.

Eine Query- oder Table-Komponente muß aktiv bleiben, solange die Daten angezeigt oder sonstwie verarbeitet werden sollen. Anders ausgedrückt: Wenn das Property Active der Datenmenge nicht mehr den Status True aufweist, besteht keine Möglichkeit, die Datenmenge zu verarbeiten. Erst das Setzen von Active auf True bzw. der Open-Befehl führt den Select-Befehl aus und beendet damit die Transaktion.

hstreicher 7. Okt 2015 06:50

AW: Firebird Transaction lange offen
 
Die Antwort lautet :

Firebird hat dafür die "Read Only" Transaction

http://www.firebirdsql.org/refdocs/l...set-trans.html

http://de.slideshare.net/ibsurgeon/3...ansactionswork

mfg Hannes

mkinzler 7. Okt 2015 06:52

AW: Firebird Transaction lange offen
 
Ich würde die Daten clientseitig cachen.

Gruber_Hans_12345 7. Okt 2015 07:07

AW: Firebird Transaction lange offen
 
Zitat:

Zitat von Perlsau (Beitrag 1317842)
Ich vermute stark, du verwechselst hier was: Nicht die Transaktion bleibt offen, sondern das Query bleibt aktiv (Active = True). Die Transaktion kann gar nicht offenbleiben, nachdem die Daten via select von der Datenbank angefordert wurden und eingetroffen sind. Wäre die Transaktion noch offen, würde der Select-Befehl noch auf seine Ausführung warten.

Eine Query- oder Table-Komponente muß aktiv bleiben, solange die Daten angezeigt oder sonstwie verarbeitet werden sollen. Anders ausgedrückt: Wenn das Property Active der Datenmenge nicht mehr den Status True aufweist, besteht keine Möglichkeit, die Datenmenge zu verarbeiten. Erst das Setzen von Active auf True bzw. der Open-Befehl führt den Select-Befehl aus und beendet damit die Transaktion.

Meines wissens nicht

denn ich habe ja ne TIBQuery und ne TIBTransaction, und sobald ich die TIBTransaction schleiße sind auch die daten aller zugehörigen IBQuerys oder IBTables weg.
Und auch am Firebird Server kann ich mir ja die offenen Transaction anschauen und sehe, das es eigentlich so ist.

@mkinzler
Ja Clientseitig cachen ist ne möglichkeit, und mache ich bei meinen eigenen Sachen auch, nur für die Drittanbieter Software wird es halt um einige schwieriger, und aufwändiger, und ich erhoffte mir eine schneller und fast genau so gute lösung.

@hstreicher
Aber wenn eine Transaction READ ONLY ist, dann beudetet das ja nicht, das die Records nicht trotzdem Versioniert werden müssen solange die Transaction offen ist oder?
eventuell eine kombination mit READ COMMITTED oder [NO] RECORD_VERSION

nur ich will auf keinen Fall etwas verschlimmbessern

mkinzler 7. Okt 2015 07:11

AW: Firebird Transaction lange offen
 
Mit einem Clientdataset o.ä. sollte das kein Problem sein.

Perlsau 7. Okt 2015 07:17

AW: Firebird Transaction lange offen
 
Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1317854)
Meines wissens nicht, denn ich habe ja ne TIBQuery und ne TIBTransaction, und sobald ich die TIBTransaction schleiße sind auch die daten aller zugehörigen IBQuerys oder IBTables weg.

Mit "sobald ich die TIBTransaction schleiße" meinst du vermutlich, das Property Active der TIBTransaction auf False setzen? Die Komponente TIBTransaction ist nicht die Transaction, sondern verwaltet Transaktionen. Natürlich muß die Transaktions-Komponente so lange aktiv bleiben, wie die von ihr abhängigen Queries aktiv sind, damit sie auf Anforderungen reagieren kann.

Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1317854)
Und auch am Firebird Server kann ich mir ja die offenen Transaction anschauen und sehe, das es eigentlich so ist.

Das würde mich jetzt interessieren: Wo genau siehst du am Firebird-Server die offenen Transaktionen?

Gruber_Hans_12345 7. Okt 2015 07:20

AW: Firebird Transaction lange offen
 
Zitat:

Zitat von Perlsau (Beitrag 1317858)
Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1317854)
Meines wissens nicht, denn ich habe ja ne TIBQuery und ne TIBTransaction, und sobald ich die TIBTransaction schleiße sind auch die daten aller zugehörigen IBQuerys oder IBTables weg.

Mit "sobald ich die TIBTransaction schleiße" meinst du vermutlich, das Property Active der TIBTransaction auf False setzen? Die Komponente TIBTransaction ist nicht die Transaction, sondern verwaltet Transaktionen. Natürlich muß die Transaktions-Komponente so lange aktiv bleiben, wie die von ihr abhängigen Queries aktiv sind, damit sie auf Anforderungen reagieren kann.

Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1317854)
Und auch am Firebird Server kann ich mir ja die offenen Transaction anschauen und sehe, das es eigentlich so ist.

Das würde mich jetzt interessieren: Wo genau siehst du am Firebird-Server die offenen Transaktionen?

primitv so, (halt noch paar links dazu ... )

Code:
SELECT * FROM MON$TRANSACTIONS
ja meine wenn ich die TIBTransaktion.Active auf False setzte bzw. mit einem Transaction.Commit oder so, wenn ich ein CommitRetaining mache, dann bleiben daten erhalten, aber die Transaktion auch offen

tsteinmaurer 7. Okt 2015 07:58

AW: Firebird Transaction lange offen
 
Read-Only, Read Committed. Transaktionen in dieser Kombination können lange offen bleiben. Read Committed gibt dir halt keine stabile Ergebnismenge bei mehrmaligen Ausführen einer Abfrage, aber das mußt du wissen, ob das für deinen Anwendungsfall Ok ist.

Gruber_Hans_12345 7. Okt 2015 08:52

AW: Firebird Transaction lange offen
 
Zitat:

Zitat von tsteinmaurer (Beitrag 1317862)
Read-Only, Read Committed. Transaktionen in dieser Kombination können lange offen bleiben. Read Committed gibt dir halt keine stabile Ergebnismenge bei mehrmaligen Ausführen einer Abfrage, aber das mußt du wissen, ob das für deinen Anwendungsfall Ok ist.

Ok danke mal

dh. alle andern die nicht "Read Committed" sind dürfen nicht lange offen bleiben? (dürfen -> damit nicht ein haufen Record Versionen entstehen und das system langsamer wird)

bewirkt ein Read Only eignetlich eine besserung abgesehen davon das ich halt nicht schreiben kann?

tsteinmaurer 7. Okt 2015 10:39

AW: Firebird Transaction lange offen
 
Es ist die Kombination aus Read Committed UND Read-Only. Generell sollte man Read-Only Transaktionen verwenden, wenn nur gelesen wird. So teilt man das Firebird entsprechend mit und Firebird weiß dann für konkurrierende Transaktionen, d.h. hier keine Datenänderungen zu erwarten sind.

Gruber_Hans_12345 7. Okt 2015 10:57

AW: Firebird Transaction lange offen
 
Also habe ich nur die möglichkeit für Reports
- entweder normal, dann habe ich richtige Daten aber die Transaktion sperrt die ganze zeit
- READONLY read committed, dann sperrt nix, aber die daten können falsch sein, wenn ich vor/zurückblättere
- Umbau auf Cachen der Daten

tsteinmaurer 7. Okt 2015 11:12

AW: Firebird Transaction lange offen
 
Was verstehst du unter "Sperren"?

Gruber_Hans_12345 7. Okt 2015 11:27

AW: Firebird Transaction lange offen
 
Zitat:

Zitat von tsteinmaurer (Beitrag 1317884)
Was verstehst du unter "Sperren"?

Das die Datenbank dann mit der zeit langsamer wird, weil der Garbage Collector nicht laufen kann, und die Records immer Versioniert werden müssen ...

tsteinmaurer 7. Okt 2015 12:01

AW: Firebird Transaction lange offen
 
Wenn du das unter Sperre verstehst, dann hast du vollkommen Recht.

himitsu 7. Okt 2015 12:45

AW: Firebird Transaction lange offen
 
Warum überhaupt eine Transaktion?

"Ein" SELECT ist in sich geschützt, vor fremden Schreibzugriffen.

mkinzler 7. Okt 2015 12:56

AW: Firebird Transaction lange offen
 
Das hat hat mit der Art und Weise zu tun wie FireBird die Transaktionssteuerung durchführt. Anstatt eines Logs wird Versionierung verwendet. Deshalb müssen auch Abfragen in einem Transaktionskontext erfolgen (zur Feststellung welche Version des Datensatzes genommen werden soll).

Gruber_Hans_12345 7. Okt 2015 12:57

AW: Firebird Transaction lange offen
 
Zitat:

Zitat von himitsu (Beitrag 1317894)
Warum überhaupt eine Transaktion?

"Ein" SELECT ist in sich geschützt, vor fremden Schreibzugriffen.

weil zumindest bei IBX ohne Transaktion gar nix geht ....

tsteinmaurer 7. Okt 2015 14:56

AW: Firebird Transaction lange offen
 
In Firebird geht nix ohne den Kontext einer Transaktion

BUG 7. Okt 2015 16:27

AW: Firebird Transaction lange offen
 
Zitat:

Zitat von tsteinmaurer (Beitrag 1317927)
In Firebird geht nix ohne den Kontext einer Transaktion

Alles andere wäre ja auch Blödsinn ... wer will denn inkonsistente Daten aus einer Datenbank lesen. Schreibenden Zugriffen außerhalb von Transaktionen würden es unmöglich machen, Transaktionen überhaupt zu implementieren.

Zitat:

Zitat von himitsu (Beitrag 1317894)
"Ein" SELECT ist in sich geschützt, vor fremden Schreibzugriffen.

Jup, weil es in einer einzelnen Transaktion läuft :stupid:

Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1317867)
bewirkt ein Read Only eignetlich eine besserung abgesehen davon das ich halt nicht schreiben kann?

Es kann halt keine Schreibkonflikte mit anderen Transaktionen geben; mehrere nur-lesende Transaktionen beeinflussen einander gar nicht. Also, wenn das nichts wert ist.

Sir Rufo 7. Okt 2015 17:10

AW: Firebird Transaction lange offen
 
Interessant dazu folgender Eintrag in der Doku
http://docwiki.embarcadero.com/Libra...ions.Isolation

tsteinmaurer 7. Okt 2015 17:12

AW: Firebird Transaction lange offen
 
Nur zur Info. Firebird unterstützt keine Dirty Reads. Gott sei Dank.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz