PDA

View Full Version : Commitment Control und Trigger Programme.



Seiten : [1] 2

Tonazzo
29-09-15, 14:07
Hallo,

Ich habe ein Erfassungsprogramm zur Verwaltung von Parametern geschrieben. Die Parameter werden in eine Kopfdatei und dazugehörige Positionsdatei geschrieben/geändert/gelöscht. Die Dateizugriffe sind jeweils in unterschiedliche Prozeduren eines Serviceprogrammes ausgelagert. Das Serviceprogramm läuft unter der ACTGRP(*CALLER) und alle Dateizugriffe sind mit SQL realisiert.

An der Positionsdatei hängt ein Trigger Programm dran. Dieses läuft ebenfalls unter ACTGRP(*CALLER) - allerdings wird in diesem Programm kein SQL benutzt. Die Änderungen/Neuanlage/Löschungen der Sätze aus der Positionsdatei werden in eine History Datei (mit write) aufgezeichnet.

Mein Verwaltungsprogramm läuft unter der ACTGRP(Name des Programmes). In diesem Programm wird mit commit(e) bzw. rolBk gearbeitet.

Jetzt folgender Fall:
Der Benutzer will im Verwaltungsprogramm den Kopfsatz löschen - in diesem Fall sollen zuerst alle Positionen gelöscht werden. Ist das Löschen der Positionen fehlerfrei gelaufen, wird danach der Kopfsatz gelöscht und ein Commit wird abgesetzt - im Fehlerfall wird ein rolBk abgesetzt und alle bis dahin gelöschten Positionen werden wiederhergestellt.

Um das zu testen habe ich eine Position gesperrt, so dass diese nicht gelöscht werden konnte. Das Programm hat 4 Positionen gelöscht bis es auf ein LCKW stehen blieb - Wartezeit 60Sek - In der History standen die 4 gelöschten Sätze. DSPFD auf Positionsdatei = Anzahl gelöschter Sätze = 4. Nach Ablauf der Dateiwartezeit wurde das rolBk ausgeführt.
Die 4 Positionen wurden wiederhergestellt. DSPFD auf Positionsdatei = Anzahl gelöschter Sätze = 0.
In der History standen die 4 gelöschten Sätze noch drin - ich hätte jetzt aber erwartet das diese Sätze aber noch zusätzlich als Neuanlage auftauchen würden, da die Löschung durch das rolBk rückgängig gemacht wurden.
Ich kann verstehen, dass das Trigger Programm den commit/rolbck nicht mitmacht - da ja auch keine commitanweisung in der F-Bestimmung steht. Aber das Wiedereinstellen der Sätze in die Positionsdatei durch das rolbck wurde aber vom Trigger Programm auch nicht registriert.

Wo liegt das Problem bzw. wäre in diesem Fall Best Practice?

Für die Hilfe bedanke ich mich im Voraus und sorry für den Roman.

Viele Grüße

BenderD
29-09-15, 14:20
... warum nicht einfach eine referential constraint mit cascade?

BTW: SQL und RPG commit sollte man nicht mixen.
und achaj: ein Rollback auf ein delete ist kein insert.

D*B

Fuerchau
29-09-15, 14:23
Das Triggerprogramm sollte (aus dem Bauch heraus) auch in ACTGRP(*CALLER) laufen.
Die Logdatei wird wohl nicht journalisiert sonst müsstest du in deinem Triggerprogramm Commit/Rollback bei eigener ACTGRP durchführen.

Ich denke, im Rollbackfall wird der Trigger nicht aufgerufen.

Tonazzo
29-09-15, 14:37
... warum nicht einfach eine referential constraint mit cascade?

BTW: SQL und RPG commit sollte man nicht mixen.
und achaj: ein Rollback auf ein delete ist kein insert.

D*B


Hallo,
ein Rollback auf ein delete ist kein insert. Aber eine Änderung am Satz.
Und somit sollte das Triggerprogramm darauf reagieren.

Tonazzo
29-09-15, 14:41
Das Triggerprogramm sollte (aus dem Bauch heraus) auch in ACTGRP(*CALLER) laufen.
Die Logdatei wird wohl nicht journalisiert sonst müsstest du in deinem Triggerprogramm Commit/Rollback bei eigener ACTGRP durchführen.

Ich denke, im Rollbackfall wird der Trigger nicht aufgerufen.

Das Triggerprogramm läuft bereits unter ACTGRP(*CALLER). Die Logdatei bzw. Historydatei wird
ebenfalls laut DSPFD journalisiert.

Aber warum soll im Rollbackfall der Trigger nicht aufgerufen werden. Ereignisbedingung des Trigger an der Positionsdatei: TRGEVENT *INSERT/*UPDATE/*DELETE

Fuerchau
29-09-15, 14:58
Nur gibt es keinen Trigger für UNDELETE, UNINSERT, UNUPDATE.
Und deine Logdatei müsste auch gelöscht sein.

BenderD
29-09-15, 15:00
Hallo,
ein Rollback auf ein delete ist kein insert. Aber eine Änderung am Satz.
Und somit sollte das Triggerprogramm darauf reagieren.

ein rollback ist eine nicht-Satzänderung!

Tonazzo
29-09-15, 15:16
Nur gibt es keinen Trigger für UNDELETE, UNINSERT, UNUPDATE.
Und deine Logdatei müsste auch gelöscht sein.

Was meinst du mit Logdatei?
Ich habe meine Positionsdatei, in der die gelöschten Sätze wiederhergestellt wurden.
Ich habe meine History Datei, in der die Löschungen aufgezeichnet worden sind.

Pikachu
29-09-15, 15:32
Nimm deine History noch mit unter COMMIT-Steuerung.
Dann werden durch den ROLLBACK alle Spuren verwischt.

Fuerchau
29-09-15, 15:37
Du sagst doch, dass die History journalisiert wird.
Dann sollte der Rollback diese doch auch löschen.