[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Aug 2003
    Beiträge
    62

    SQL und Commit

    Hallo,

    habe in einem SQLRPGLE Programm
    dieses Statement

    EXEC SQL set option commit = *ALL

    eingebaut. Damit wird wohl "STRCMTCTL" ausgeführt.
    Ich kann jetzt in dem Programm COMMIT und ROLLBACK ausführen.
    Wie führe ich den Befehl ENDCMTCTL in SQLRPGLE aus ?
    Vielen Dank in voraus.

  2. #2
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    Hallo Günter,

    Wie führe ich den Befehl ENDCMTCTL in SQLRPGLE aus ?
    Funktioniert folgendes nicht?

    EXEC SQL set option commit = *NONE

    Oder meinst Du was anderes?

    Gruß,
    Konni

  3. #3
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    Ich hab gerade übersehen, dass man einen SET OPTION ja nur einmal ausführen kann.

    Vielleicht geht es ja, wenn man den ENDCMTCTL per QCMDEXC aufruft?

    Gruß,
    KM

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ein ENDCMTCTL ist nur möglich, wenn keine Transaktionen mehr geöffnet sind.
    Per Commit wird allerdings bereits die nächste Transaktion gestartet (siehe DSPJOB, Commit-Definition).
    Erforderlich ist, ein CLP vorzuschalten, dass den STRCMTCTL durchführt, das Programm aufruft und nach Rückkehr sämtliche Ressorcen freigibt (RCLRSC, RCLACTGRP), notfalls noch eine Rollback selber durchführt (für nicht abgeschlossene Transaktionen) und dann den ENDCMTCTL durchführt.

    COMMIT = *ALL ist i.Ü. die schlechteste Wahl, da bereits beim Select Satzsperren gesetzt werden !
    COMMIT = *CHG (ist sowieso Default) wäre das übliche.
    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
    Aug 2003
    Beiträge
    62
    Vielen Dank für die Antworten.
    habe mit QCMDEXC den Befehl ENDCMTCTL ausgeführt.
    Dies schein zu funktionieren

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hallo,

    ich denke hier liegen noch einige Verständnis-Probleme vor.

    Voraussetzung dafür, dass Commitment-Control verwendet werden kann ist, dass die Dateien/Tabellen die verwendet werden sollen in einem Journal augezeichnet werden.

    SET OPTION Commit = *CHG (oder eine der anderen Optionen) besagt lediglich, dass in diesem Modul/Programm Commitment-Control für SQL Inserts, Updates oder Deletes verwendet wird. Ohne diese Angabe würden SQL-Statements weder festgeschrieben noch zurückgesetzt werden können. Erfolgt ein Insert, Update oder Delete auf eine nicht aufgezeichnete Datei, wird die Aktion nicht ausgeführt und ein negativer SQL-Code wird ausgegeben. Es ist jedoch möglich einzelne Inserts, Updates oder Deletes nicht unter Commitment-Control auszuführen (auch wenn SET OPTION gesetzt wurde). Dazu muss am Ende des SQL-Inserts, -Updates oder Deletes WITH NC (with No Commit) angegeben werden.

    Soll Commitment Control für native I/O verwendet werden, muss in RPG in den F-Bestimmungen für Update oder Output-Dateien das Schlüssel-Wort Commit angegeben werden. Fehlt dieses Schlüssel-Wort können die Daten für diese Datei weder festgeschrieben noch zurückgesetzt werden. Wurde Commitment Control (über STRCMTCTL) noch nicht gestartet, bricht das RPG-Programm ab.

    Ist bei Programmen mit embedded SQL (und COMMIT = Irgendwas anderes als *NONE) Commitment-Control noch nicht gestartet, bricht das Programm nicht ab, sondern führt zunächst ein STRCMTCTL aus.

    Mit Ausführung des Befehls STRCMTCTL wird der erste Commit gesetzt. Um Commit und Rollback verwenden zu können, muss dies in den Programmen/Modulen angegeben werden (s.o.), und nur diese Dateien werden festgeschrieben oder zurückgesetzt. Wird in alten Programmen Commitment-Control nicht verwendet, können diese auch wenn der Befehl STRCMTCTL gestartet wurde problemlos ausgeführt werden.

    Eine Transaktion wird startet nach dem vorhergehenden Commit und endet mit dem nächsten Commit. Wird Rollback ausgeführt, werden alle aufgezeichneten Änderungen bis zum vorhergehenen Commit zurückgesetzt.

    STRCMTCTL sollte bei Job-Start (am besten im Start-Programm) ausgeführt werden und auch erst wieder bei Job-Ende beendet werden. Beliebiges Starten und Beenden sollte vermieden werden. Weiterhin sollte man SQL das Starten nicht überlassen. Der Grund hierfür liegt darin, dass SQL den Befehl mit Default-Werten startet. Der Default für die Option Commitment Scope ist *ACTGRP, d.h. ein Commit oder Rollback funktioniert nur innerhalb der Aktivierungsgruppe. In Umgebungen, ohne 100% sauberes Aktivierungsgruppen-Design oder wenn noch OPM und ILE-Programme gemischt werden, sollte der Commitment Scope auf *JOB gesetzt werden, um unliebsame Überraschungen zu vermeiden.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    cbe is offline [professional_User]
    Registriert seit
    May 2005
    Beiträge
    392
    vielen Dank für diesen Rundumschlag zum Thema Commit! Habe noch so einiges gelernt/verstanden

    Gruß, Christian

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 11:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

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