Anmelden

View Full Version : Embedded SQL in Modul - Nach Insert bleibt Datei gesperrt (*EXCL)



Seiten : 1 [2]

BenderD
09-12-04, 11:00
@Baldur:
ein offener ODP wg. eines Inserts verursacht aber keine Sperren, die weh tun, maximal shrxxx für die Datei und record locks gibt es ohne commitment controll hier auch keine.
Und Vorsicht: der CLOSQLCSR ist nur ein impliziter close und garantiert genausowenig wie ein expliziter close (der hier nicht geht) einen close des ODP und eine Aufgabe der zugehörigen Sperre.
Ob der RCLACTGRP die Sperren aufgibt, habe ich nicht im Kopf, aber der geht hier auch nicht, weil das NOMAIN dann ja aus einer anderen ACTGRP aufgerufen wird und dann in den Wald rennt, da das aufrufende Programm nicht neu aktivieren kann (es sei denn, man bindet selber zur Laufzeit), da würde hier new helfen, aber das ist auch Schmonz.
Aber: EXCL Sperre ohne serializable ist und bleibt Bug!

mfg

Dieter


Nur, dass ein Insert-Cursor nicht explizit geschlossen werden kann (es gibt ja keinen Namen dafür).
Durch das closqlcsr=*endmod werden ja auch die Statements (hier das Insert-Statement) beim Verlassen freigegeben und somit der ODP geschlossen (jedenfalls bei meinen Test's).
Ganz sicher geht's mit einer benannten Actgrp, die nach Beenden per RCLACTGRP definitiv aufgelöst wird und auch die (automatische) DB-Anmeldung aufgehoben wird.

Fuerchau
09-12-04, 11:32
Vielleicht ist ja SQL gar nicht die Ursache. Beim Insert wird die Datei auch gar nicht mit *EXCL bzw *EXCLRD gesperrt, sondern, wie du schon korrekt sagst nur mit SHRRD.

Vielleicht wird die Datei ja irgendwie per ALCOBJ gesperrt und nur der DLCOBJ vergessen ?
Leider ist ja der Default-Scope = *JOB !!!

JonnyRico
09-12-04, 11:56
Stimmt am Insert wie gestern vermutet liegt es nicht. Das Problem titt in einem anderen Modul auf. Vor dem Insert werden einige Dateien in einem anderen Modul per
Delete from ParmLib/ParmTbl gelöscht.
Hier wird dann die Sperre gesetzt die bis zum Programmende nicht abgegeben wird und erst beim ENDJOB wieder verschwindet.
Die zu löschenden Tabellen werden per Parameter übergeben und werden dann in einer Schleife in der Modul geleert.

Do
.
.
Prepare DELSTAT
.
.
Execute DELSTAT
.
.
Enddo

Fuerchau
09-12-04, 12:21
Auch diese Sperre muss ausserhalb von SQL gesetzt sein, da auch der Delete wie der Insert keine EXCL-Sperre setzt.