Anmelden

View Full Version : SQL UPDATE und COMMIT im SQLRPGLE



Seiten : [1] 2

harkne
17-11-21, 11:09
Hallo zusammen,

ich brauche mal wieder Hilfe.

Ich führe im SQLRPGLE SQL-updates auf Dateien aus.
Wenn ich jetzt aber im RPG einen COMMIT mache, wandelt er mir das Programm nicht um weil er sagt es gibt keine Dateien die mit COMMIT definiert sind.

Da es aber mehrere UPDATES sind möchte ich erst wenn alle UPDATES durch sind die mit COMMIT fest schreiben.

Was muss ich machen?

Viele Grüße harkne

harkne
17-11-21, 11:16
Hat sich erledigt, ich mach den COMMIT im aufrufenden CL.

B.Hauser
17-11-21, 11:36
Warum verwendest Du nicht den SQL Commit?

harkne
17-11-21, 12:22
Wird der SET OPTION COMMIT=*CHG bzw. SET OPTION COMMIT=*NONE bei der Umwandlung umgesetzt?
Ich wollte das jetzt parameterabhängig machen, da der Compiler diese Anweisungen aussternt kann das ja nicht funktionieren.
Habe ich eine andere Möglichkeit?

BenderD
17-11-21, 12:36
... gibt es irgendeinen vernünftigen Grund updates per SQL ohne commit zu machen? Ich kenne keinen und etliche, dass SQL update ohne commit ein übler Kunstfehler ist.

D*B

harkne
17-11-21, 12:45
Naja jetzt komm aber. Ich mach doch einen COMMIT nur dann wenn ich sicher gehen will dass alles gemeinsam upgedated ist. Ich muss doch nicht für 10 Mio Sätze alles offen halten wenn es nicht wichtig ist ob er zwischendurch abbricht oder nicht.

In dem Programm hier werden 1-x SQLs aufgerufen. Der der das Programm aufruft entscheidet ob er den COMMIT braucht oder nicht. Die SQLs die ausgeführt werden sind ohne Variablen und liegen in einer Tabelle. Da dieses dann von verschiedenen Programmen aufgerufen wird, wird dort entschieden ob es notwendig ist, das alle unter COMMIT laufen oder nicht.

Ich persönlich verwende fast nie einen COMMIT, es sei denn ich brauche ihn wirklich wenn Abhängigkeiten vorhanden sind.

Ich wollte jetzt eigentlich nur wissen ob es eine andere Möglichkeit gibt dies variabel zu gestalten.

Fuerchau
17-11-21, 12:52
Nun ja, 10 Mio Locks gehen aber ganz schön auf die Performance.
Das wird wohl kein Tagesjob sein sonderen eher am arbeitsberuhigtem WE.

Übrigens: Transaktionen sind Konzepte die i.d.R. keine Millionen von Updates/Insert/Deletes umfassen.

BenderD
17-11-21, 12:55
... commit ist nicht gedacht für Bulk updates von 10 Mio. Sätzen, über commit werden Satzsperren gesteuert, um Transaktionen abzusichern. Bedenken muss man, dass lesen und geändert fortschreiben auch schon eine Transaktion ist!
Für Bulk updates ist es effektiver sich wiederaufsetzpunkte zu setzen, etwa per Timestamp oder Änderungssignaturen.

D*B

harkne
17-11-21, 12:57
Alles gut soweit. Gibt es eine Möglichkeit per Parameter im Programm zu sagen, die UPDATES laufen unter Commit-Steuerung oder sie laufen nicht unter Commit-Steuerung? Oder muss ich jetzt tatsächlich 2 verschiedene Programme aufrufen?

Fuerchau
17-11-21, 13:02
Ob die Updates unter Commit laufen, wird auf Modulebene per Compile-Option bestimmt.
Wenn nicht *NONE angegebene ist, muss ein STRCMTCTL (macht RPG eigentlich automatsch) aufgesetzt werden.
Wird *NONE definiert, wird jeder SQL implizit mit "with nc" ausgeführt, da du ja entschieden hast, an der Transaktion vorbei zu arbeiten.

Da du SQL's je inzwischen auch per CLLE mit RUNSQL ausführen kannst, wäre dies auf dieser Ebene angebbar, da die Commitsteuerung dem Befehl mitgegeben wird.