[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2001
    Beiträge
    832

    RPG Programm ohne commit und Serviceprogramm mit commit

    Hallo in die Runde,

    wir haben gerade folgende Frage:

    In einem RPG Programm das ohne commit Steuerung läuft
    soll jetzt eine Prozedur aus einem Serviceprogramm aufgerufen werden.

    Das Serviceprogramm ist mit der SQL Set Option commit=*chg erstellt.

    Frage 1:
    Wenn diese Prozedur im RPG Programm eingebunden ist
    und das Programm normal endet wird dann vom System ein automatischer commit gemacht ?

    Frage 2:
    Wenn diese Prozedur im RPG Programm eingebunden ist
    und das Programm nicht normal endet wird dann vom System ein automatischer rollback gemacht ?

    Gruß
    Michael

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Szenarien dieser Art sollte man vermeiden.

    Zu 1 und 2:
    Automatische Commits gibt es generell nicht. Wenn eine ACTGRP oder ein Job endet, wird ein offener Commit mit Rollback geschlossen.

    Konsequenzen hängen vom Aufrufer ab.
    Verwendet man dort ausschließlich RLA (also F-Bestimmungen) ohne Commit werden diese auch ohne Commit/Rollback-Möglichkeit verarbeitet.
    Rufst du ein Programm mit Commit auf ist bei RLA ein manueller STRCMTCTL erforderlich sonst scheitert bereits der Open. Ist das Gerufene mit SQL wird intern STRCMTCTL automatisch gestartet und alles läuft unter Commit.
    Macht der Service einen Return, bleibt die Transaktion offen bis zum Ende. Bei wiederholten Aufrufen ohne Commit erhöhen sich die Anzahl Sperren für den Rest der Welt, was dort zu Lock-Timeouts führen wird.
    Die Dateien bleiben oberhalb weiter ohne Commit.

    Ist der Aufrufer in SQL ohne Commit kann der Service scheitern, da ja die aktuelle Transaktion auf *NONE und nicht auf *CHG steht. Ich glaube nicht, das hier ein Automatismus besteht.
    Eine Transaktion wird i.d.R. erst bei der Durchführung des 1. SQL's gestartet. Rufst du den Service zuerst auf kann es sein, dass der Rufer anschließend mit seinen SQL's entweder scheitert oder nun auch mit *CHG arbeitet.

    Ausprobiert habe ich das noch nie, da solche Szenarien erst gar nicht angedacht werden sollten.

    Wenn du das trennen willst, musst du in ACTGRP's denken.
    Ein Service arbeitet i.d.R. mit *CALLER als ACTGRP. Musst du den Service nun nutzen benötigst du einen Wrapper mit eigener ACTGRP oder *NEW, der dann den Service aufruft. Der Wrapper muss dann auch einen Commit machen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... "automatische Commits" gibt es auf der AS400 leider doch, seht euch mal die defaults von RCLACTGRP an, da steht bei OPTION *NORMAL, was bedeutet, dass offene Transaktionen mit commit abgeschlossen werden (die müssen besoffen oder bekifft gewesen sein).

    Im default ist das commitlevel Eigenschaft der ACTGRP, was auch bedeutet, dass nach einer Änderung des commitlevels, sei es durch Aktivierung eines SRVPGMs oder durch set transaction (geht nur außerhalb einer transaction), das dann innerhalb dieser ACTGRP bis zur nächsten Änderung gilt.

    Verwendet man SQL für die Datenbankoperationen, ist es am einfachsten, immer mit commit zu arbeiten - auch wenn man öfter das Gegenteil erzählt bekommt. Programme, die dabei Daten fortschreiben und nicht commit machen, sind dann commit-slaves und es muss sichergestellt werden, dass im callstack auf vorheriger Ebene ein commit-master sitzt, der für das beenden von Transaktionen per commit oder rollback zuständig ist.

    Daten fortschreiben mit SQL ohne commit gehört mittlerweile zu den beliebtesten Kunstfehlern, die man sogar in "Lehrbüchern" und Schulungsunterlagen findet.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Wobei letzteres sogar noch explizit mit "update/insert/delete .... with NC" zwischendurch möglich ist.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Wobei letzteres sogar noch explizit mit "update/insert/delete .... with NC" zwischendurch möglich ist.
    ... das ist eine DB2 Erweiterung und gilt nur für das eine Statement, ohne das commit level zu ändern.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. commit(*CS) oder commit(*CHG) verwenden
    By Rathjen72 in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 04-01-22, 11:48
  2. Prozeduraufruf in Serviceprogramm durch externes Programm
    By dholtmann in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 07-03-16, 16:44
  3. Antworten: 2
    Letzter Beitrag: 12-08-14, 13:09
  4. Commit ohne Datensatzfreigabe
    By Allrounder in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 05-05-10, 13:55
  5. Antworten: 3
    Letzter Beitrag: 16-03-07, 08:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •