PDA

View Full Version : SQL und Commit



hgdieterle
22-07-09, 07:09
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.

KM
22-07-09, 07:57
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

KM
22-07-09, 08:10
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

Fuerchau
22-07-09, 08:29
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.

hgdieterle
22-07-09, 10:10
Vielen Dank für die Antworten.
habe mit QCMDEXC den Befehl ENDCMTCTL ausgeführt.
Dies schein zu funktionieren

B.Hauser
25-07-09, 12:54
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

cbe
28-07-09, 08:28
vielen Dank für diesen Rundumschlag zum Thema Commit! Habe noch so einiges gelernt/verstanden

Gruß, Christian