PDA

View Full Version : Transaktionssteuerung im RPG Programm



Seiten : [1] 2

shuelzer
16-05-13, 07:41
Hallo zusammen,

ich habe folgendes Problem mit dem ihr mir vielleicht helfen könntet:

Ich möchte eine einfach Transaktion durchführen und diese committen. Funktioniert auch alles wunderbar, nur zeigt mir der Transaktionsstatus nach dem commit noch eine offene Transaktion an. Ist das so korrekt? Wie bekomme ich es hin, dass die Transaktion mit dem commit oder rollback beendet ist?

Folgendes kleines Beispiel habe ich ausprobiert:

- Ich mache eine Transaktion auf mit
exec sql set transaction isolation level read uncommitted, read write;
- dann mache ich mein Insert/Update
- danach folgt im einfachen Test der Commit

Für eure Hilfe wäre ich sehr dankbar!

BenderD
16-05-13, 07:51
Hallo zusammen,

ich habe folgendes Problem mit dem ihr mir vielleicht helfen könntet:

Ich möchte eine einfach Transaktion durchführen und diese committen. Funktioniert auch alles wunderbar, nur zeigt mir der Transaktionsstatus nach dem commit noch eine offene Transaktion an. Ist das so korrekt? Wie bekomme ich es hin, dass die Transaktion mit dem commit oder rollback beendet ist?

Folgendes kleines Beispiel habe ich ausprobiert:

- Ich mache eine Transaktion auf mit
exec sql set transaction isolation level read uncommitted, read write;
- dann mache ich mein Insert/Update
- danach folgt im einfachen Test der Commit

Für eure Hilfe wäre ich sehr dankbar!

... hast Du da einen wüsten Mix von SQL und RekordLöffelExzem? Wenn das alles per SQL erfolgt (exec scl insert/update... exec sql commit), dann sollte das funzen, oder einen SQL Fehler im SQLCOD zurück bringen. Letzteres passiert zum Beispiel, wenn irgendwelche Dilletanten dafür sorgen, dass die Tabellen nicht journalisiert werden, oder die Command defaults für die CRTSQLxxx Befehle verhunzt haben.

D*B

shuelzer
16-05-13, 08:10
Es wird alles per SQL gemacht und die Lib ist journalisiert. Ein Rollback funktioniert auch, nur der Status ist eben noch 1 nach dem Rollback.

Welche Parameter muss ich denn bei dem CRTSQLRPGI beachten?

Commit steht auf *NONE.

Fuerchau
16-05-13, 08:16
Eigentlich sollte Commit=*CHG bei der Umwandlung (oder SET OPTION) angegeben werden.

exec sql set transaction isolation level read uncommitted, read write;

Ist unnötig (vor allem read uncommited)!

andreaspr@aon.at
16-05-13, 08:18
Ich Tippe darauf dass read uncommitted der Grund dafür sein könnte.
Ändere diesen und führe den Test nochmal aus.
lg Andreas

BenderD
16-05-13, 08:54
Es wird alles per SQL gemacht und die Lib ist journalisiert. Ein Rollback funktioniert auch, nur der Status ist eben noch 1 nach dem Rollback.

Welche Parameter muss ich denn bei dem CRTSQLRPGI beachten?

Commit steht auf *NONE.

... was verstehst Du jetzt unter Status? Was zeigt WRKCMTDFN an?

D*B

shuelzer
16-05-13, 09:14
Unter Status verstehe ich den "Status" der Transaktion, den ich mit get Diagnostics abfragen kann.

WRKCMTDFN zeigt eine offene Transaktion für den Job nach dem Commit.

shuelzer
16-05-13, 09:52
Ich Tippe darauf dass read uncommitted der Grund dafür sein könnte.
Ändere diesen und führe den Test nochmal aus.
lg Andreas

Ich habe alle Isolationslevel ausprobiert mit dem gleichen Effekt.

Ich versteh es nicht!

BenderD
16-05-13, 15:17
Unter Status verstehe ich den "Status" der Transaktion, den ich mit get Diagnostics abfragen kann.

WRKCMTDFN zeigt eine offene Transaktion für den Job nach dem Commit.

... was sagt denn der SQLCODE direkt nach jedem sql statement dem Commit? und wie sieht das bei WRKCMTDFN genau aus (dass da eine Commit Definition angezeigt wird ist so in Ordnung

D*B

shuelzer
17-05-13, 07:54
... was sagt denn der SQLCODE direkt nach jedem sql statement dem Commit? und wie sieht das bei WRKCMTDFN genau aus (dass da eine Commit Definition angezeigt wird ist so in Ordnung

D*B

Ich weiss nicht genau welche Informationen Sie brauchen, aber der SQLCODE ist nach jedem Statement 0.

WKRCMTDFN zeigt eine neue Commit-Definition, ab dem Zeitpunkt des Ausführens von Set Isolation Level mit der Standardsperrstufe *CS.
Lokal anstehende Änderungen steht auf Nein vor dem Insert.
Nach dem Insert dann auf Ja und nach dem Commit wieder auf Nein. Die Commit-Definition bleibt bestehen.

Jetzt war die Idee, nach dem Commit oder Rollback mit Set Isolation no commit die Transaktion zu beenden. Funktioniert aber auch nicht.

Ein exec sql set option liefert ein SQL-Vorkompilierungsfehler.

Sry für die vielen Fragen. Wir sind noch neu in der Thematik Transaktionen auf System i und machen gerade unsere ersten Gehversuche.