-
set transaction isolation level
Hallo,
ich versuche 2 Datenänderungen (inserts) mit einer Transaktion zu umgeben, damit entweder beide oder keine Änderung stattfindet.
Aus der Doku werde ich nicht wirklich schlau.
Grundsätzlich ist Commitment Control aus. Ich möchte es nur für diese Aktion verwenden.
Da gibts doch bestimmt ein einfaches Beispiel. Meine Versuche endeten alle mit SQL-Fehlern.
Ich stelle mir das so vor:
exec sql set transaction isolation level ???;
exec sql insert into ... ;
exec sql insert into 2...;
wenn fehler
exec sql ROLLBACK;
sonst
exec sql COMMIT;
Danke schon mal.
-
1. Dafür sorgen das die Dateien/Tabellen auch wirklich journalisiert werden.
2. Wenn Fehler schon hinter dem ersten Insert abfangen und zweites Insert nciht ausführen
3. zweites Insert abfragen und auch COMIT/ROLLBACK
So sollte es gehen.
-
Es wäre schon mal interessant zu wissen, welche Fehler Du bekommst.
Ansonsten sollte es wie folgt funktionieren.
1. Beide Dateien im Journal registrieren.
2. Programm mit Option COMMIT=*CHG umwandeln (oder besser ein SET OPTION-Statement mit COMMIT=*CHG vor dem 1. SQL-Statement in den QuellCode einfügen)
3. Sicherheitshalber vor dem ersten INSERT ein COMMIT-Statement ausführen (damit nicht festgeschriebene Änderungen, festgeschrieben werden)
4. Erstes Insert ausführen
5. Wenn SQLCODE < *ZEROS --> ROLLBACK (Und Ende)
6. Zweites Insert ausführen
7. Wenn SQLCODE < *ZEROS --> ROLLBACK (Und Ende)
8. COMMIT
Etwa so:
Code:
Exec SQL Set Option Commit=*CHG;
Exec SQL Commit;
Exec SQL Insert ....;
If SQLCODE < *Zeros;
Exec SQL Rollback;
Return;
EndIf;
Exec SQL Insert ....;
If SQLCODE < *Zeros;
Exec SQL Rollback;
Return;
EndIf;
Exec SQL Commit;
Anmerkung: SET TRANSACTION ISOLATION ist nicht erforderlich. SQL startet Commitment Control automatisch, bei COMMIT<>*NONE und falls noch nicht gestartet.
Wenn Du in RPG-Programmen nicht explizit COMMIT in den F-Bestimmungen angegeben hast und die sonstigen SQL-Programme mit INSERT/UPDATE/DELETE mit COMMIT=*NONE umgewandelt hast, passiert nichts, wenn die Commitment Steuerung gestartet bleibt.
Du kannst natürlich auch nach Programm-Ende explizit den CL-Befehl ENDCMTCTL ausführen.
Birgitta
-
... ob set option besser ist, weiß ich nicht; ich würde in jedem Fall ein CRTSQLRPGI OBJTYPE(*MODULE) machen, da man die Sperrstufe dann auf module Ebene machen kann. Dieses Modul erstellt man dann mit commit level <> *NONE; dann läuft in diesem Modul alles mit commit, in allen anderen Module mit der Sperrstufe des jeweiligen Moduls.
Zu Beginn macht man selbstredend kein "Angst-Commit", sondenr allenfalls ein Rollback, um unvollständige Transaktionen abzuräumen.
Warum man noch F-Karten ablochen soll, wenn man embedded SQL kann, erschließt sich mir ebenfalls nicht und ENDCMTCTL würde ich ebenfalls bleiben lassen, das kann Probleme bei Folgeaufrufen geben.
D*B
Similar Threads
-
By dibe in forum IBM i Hauptforum
Antworten: 19
Letzter Beitrag: 21-12-15, 22:48
-
By DEVJO in forum NEWSboard Programmierung
Antworten: 12
Letzter Beitrag: 29-09-15, 14:07
-
By coolie in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 10-10-14, 09:06
-
By coolie in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 07-08-14, 15:11
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks