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

    sql commit und servicepgm

    Hallo ,

    ich habe folgendes Szenario:

    RPG Programm läuft mit set option commit=*chg und actgrp(*new).
    In dem RPG wird mit Servicemodulen gearbeitet. Es sind keine lokalen Tabellen im RPG.

    In dem RPG wird ein Service mit actgrp caller aufgerufen der die DB Operationen ausführt.
    PHP-Code:
    //DS an Update Service übergeben
    Errorcheck  NEWSA01_updateDataTab01P(DSBildschirmfelder);

         if  
    Errorcheck.Errorcode =  '0000';
             
    EXEC SQL COMMIT;  
             return *
    on;   // hier ist  SQLSTATE = '00000'
         
    else;
             
    EXEC SQL Rollback;
             return *
    off;
         ENDIF; 

    Das Serviceprogramm läuft mit dem set commit=*none.
    Der commit wird einfach ignoriert.

    Frage: Wie kann ich in der Konstellation eine Transaktionsteuerung durchführen?
    ( Wie kann man das Thema Transaktionsteuerung in Servicemodulen lösen )


    Gruß
    Michael

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Grundsätzlich hat jede ACTGRP seine eigene Commit-Definition.
    Nun kommt es auf die Aufgabenstellung an:
    Ein Service-Programm sollte nie die Transaktion des Aufrufers zerstören, da sonst commit/rollback durchgeführt werden, die der Rufer nicht erwartet.
    Muss ein Service-Programm eine eigene Transaktion durchführen, die unabhängig vom Rufer ist, so bietet sich hier eine benannte ACTGRP oder *NEW (was schlechter, also weniger performant, ist) an.

    Eine Mischung zwischen Service-Funktionen über eine gemeinsame Transaktion als auch einer eigenen Transaktion kann in einem Service-Programm nicht erfolgen.
    Dann kannst du das Transaktionskonzept gleich vergessen.
    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.287
    ... du musst das SRVPGM mit COMMIT(*CHG) wandeln, ansonsten ist alles richtig.

    D*B

    PS: statt Variable errorcode, wäre das senden einer Escape Message und eine monitor group im Aufrufer eleganter.
    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
    Jan 2001
    Beiträge
    833
    Hi zusammen,

    danke für die Info's

    man wird immer schlauer :-)
    Mit der Variante *CHG im Service werden wir uns anfreunden.

    An dieser Stelle nochmal einen herzlichen Dank an alle Forumsteilnehmer.

    Gruß
    Michael

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Trotzdem solltest du dir das mit dem Commit dann auch überlegen, da dieser ja nun mal die gesamte Transaktion abschließt, nicht nur den kleinen Teil des Services.
    Insbesonders das Aufheben von Sperren könnte da ein Pproblem werden.
    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

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... Transaktionssteuerung und Modularisierung sind kein Hexenwerk, ein Programm spielt Commit Master und steuert die Transaktion und beinhaltet üblicherweise selber keine Datenbankzugriffe. Die Zugriffe werden von Zugriffsprogrammen (technisch SRVPGM) gemacht, die als Commit Slaves (:= machen kein Commit oder Rollback) agieren.
    Treten in den Slaves Probleme auf, entscheidet der Master ob diese Transaktions relevant sind und agiert entsprechend mit Commit oder Rollback. Der Master läuft in einer benamten ACTGRP, die Slaves in *CALLER.
    AS400 typisch muss man beim RCLACTGRP aufpassen, der hat den idiotischen Default OPTION(*NORMAL).
    Sperren werden Commit typisch bis zum Transaktionsende gehalten, solange man den Anfängerfehler nicht macht, zwischendurch einen EXFMT zu machen passt das so.

    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/

  7. #7
    Registriert seit
    Jan 2001
    Beiträge
    833
    Zitat Zitat von BenderD Beitrag anzeigen
    ... Transaktionssteuerung und Modularisierung sind kein Hexenwerk, ein Programm spielt Commit Master und steuert die Transaktion und beinhaltet üblicherweise selber keine Datenbankzugriffe. Die Zugriffe werden von Zugriffsprogrammen (technisch SRVPGM) gemacht, die als Commit Slaves (:= machen kein Commit oder Rollback) agieren.
    Treten in den Slaves Probleme auf, entscheidet der Master ob diese Transaktions relevant sind und agiert entsprechend mit Commit oder Rollback. Der Master läuft in einer benamten ACTGRP, die Slaves in *CALLER.
    AS400 typisch muss man beim RCLACTGRP aufpassen, der hat den idiotischen Default OPTION(*NORMAL).
    Sperren werden Commit typisch bis zum Transaktionsende gehalten, solange man den Anfängerfehler nicht macht, zwischendurch einen EXFMT zu machen passt das so.

    D*B
    Hallo nochmal eine kleine Rückfrage:

    Würde es da Sinn machen statt actgrp(*new) den Programmnamen als Aktivierungsgruppe zu verwenden ?

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Welchen Namen du dir da ausdenkst spielt keine Rolle.
    *NEW wird dann gerne verwendet, wenn man sich nicht sicher ist, dass auch alles zu gemacht wird, was aufgerufene Programme mit *CALLER so hinterlassen und das eigene Programm auf jeden Fall neu initialisiert wird. Allerdings würde da ebenso ein *INLR=*ON ja schon reichen.

    Wiederum muss man ebenso sehen, ob dieses Programm u.U. wiederum von woanders aufgerufen wird, usw. usf.
    Und für Serviceprogramme gilt i.d.R., wie Dieter ja beschreibt, dass diese ja einen Service bereitstellen und u.U. Fehlercodes zurückgeben. Demnach sollten diese niemals Commit/Rollback machen, da ein Service ja immer einen Aufrufer benötigt.

    Ein weiteres Problem bei deinem Beispiel ist u.U., dass STRCMTCTL erst bei der Ausführung des 1. SQL's in einer ACTGRP gestartet wird. Die reine Definition per Option dient nur dem Compiler und generiert keinen Code (siehe Spool).
    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

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    @ACTGRP: ich bin eher für benamte ACTGRP, das ist beim DSPJOB einfacher zu verstehen. Wenn ich nix besseres weiß, dann nehme ich den Programmnamen, für stateless Functions nehme ich NORECLAIM.
    Da ich sowieso alle statefull Variablen in eine DS this packe, lässt sich das mit clear this reinitialisieren (zudem kann man da leicht mehrere Sets von Zuständen vorhalten).

    @Start Commit: wann das gestartet wird, ist eigentlich Banane, die Transaktion startet in jedem Fall Commit Controll, falls das noch nicht vorher passiert ist.

    @Fehlercodes: Ich halte nix von Fehler Rückgabe per Parameter und bevorzuge senden einer Escape Message, da muss der Aufrufer reagieren, sonst sägt es ihn runter.

    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/

Similar Threads

  1. Commit im CL
    By mk in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 09-03-17, 13:09
  2. Prozeduren in Servicepgm von einem Anderen Programm aus aufrufen.
    By dholtmann in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 22-07-16, 08:57
  3. Commit ?
    By HEBORA in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 18-10-15, 20:00
  4. IFS und Commit
    By mk in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 23-02-15, 15:57
  5. Trigger mit Servicepgm
    By Robi in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 28-05-02, 16:45

Berechtigungen

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