[NEWSboard IBMi Forum]

Thema: SQL Locks

  1. #1
    Registriert seit
    Aug 2001
    Beiträge
    2.875

    Unhappy SQL Locks

    Hallo Leute,

    wir haben folgendes Problem:

    In einem SQLRPG-Programm wird vom Query-Optimizer eine Join-File als Zugriffsweg ausgewählt.
    Für die SQL-Abfrage ist keine Join-File notwendig.
    Das SQL-Statement ist mit "FOR READ ONLY" definiert.

    Ein anderes paralell laufendes SQLRPG-Programm wählt ebenfalls eine Join-File über die gleichen physischen Dateien aus.
    Auch in diesem Fall ist keine Join-File für die SQL-Abfrage notwendig.
    Auch dieses SQL-Statement ist mit "FOR READ ONLY" definiert.

    Trotzdem erhält nur ein Programm den Zugriff auf die benötigte Datei.
    In dem anderen wird SQLCOD -913 (Row or object &1 in &2 tpye *&3in use) ausgegeben.

    Tritt dieses Problem auch bei anderen auf?
    Wie kann ich dies vermeiden?
    Oder handelt es sich um einen Bug?

    Sorry ich habe diesen Punkt auch noch unter Anwendungs-Entwicklung erfasst, ich war mir nicht ganz sicher welches der richtige ist.

    Danke im voraus

    B.Hauser
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.245

    Post

    Die Auswahl der Joinfile hat nur etwas damit zu tun, den Zugriffsweg zu optimieren. Es wird nur der Schlüssel des Joins verwendet.

    Zur Lock-Situation:

    Prüfen Sie, welche Commit-Option sie verwenden, prüfen sie, ob sie "FOR READ ONLY" auch tatsächlich angegeben haben, ansonsten wir nämlich eine Update-Möglichkeit erwartet und die Tabelle gesperrt (siehe Commit-Option).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.287

    Post

    Hallo,

    Table Locks gibt es bei SQL lediglich bei Verwendung des Sperrlevels Serializable und das ist mir bisher noch nicht über den Weg gelaufen, obwohl es eigentlich vom SQL Standard gefordert wird.

    Es geht kein Weg daran vorbei den Code rauszurücken und dann kann es immer noch sein, dass irgendein RLA Schinken der Verursacher ist.

    mfg

    Dieter Bender
    <BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>Original erstellt von Fuerchau:
    Die Auswahl der Joinfile hat nur etwas damit zu tun, den Zugriffsweg zu optimieren. Es wird nur der Schlüssel des Joins verwendet.

    Zur Lock-Situation:

    Prüfen Sie, welche Commit-Option sie verwenden, prüfen sie, ob sie "FOR READ ONLY" auch tatsächlich angegeben haben, ansonsten wir nämlich eine Update-Möglichkeit erwartet und die Tabelle gesperrt (siehe Commit-Option).
    [/quote]

    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.875

    Post

    Hallo,

    es kann eigentlich nicht am SQL-Code liegen, da beide Programm seit ca. 3 Jahren laufen.
    Das Problem tritt erst auf, seit wir von Release V4R4M0 auf Release V5R1M0 umgestiegen sind.

    Das gleiche Lock-Problem tritt auch im interaktiven SQL auf, wenn eine Join-File als Zugriffsweg ausgewählt wurde und Sätze in einer der physischen Dateien gelockt sind.
    Auch dann wenn bei dem Select-Statement "FOR READ ONLY" angegeben wird.

    STRSQL läuft mit Commit *NONE.

    Die SQL-Programme sind mit Commit *CHG umgewandelt, da auch Updates erfolgen müssen.
    Pro Programm werden u.U. mehrere SQL-Abfragen verwendet.

    mfg

    B.Hauser

    <BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>Original erstellt von BenderD:
    Hallo,

    Table Locks gibt es bei SQL lediglich bei Verwendung des Sperrlevels Serializable und das ist mir bisher noch nicht über den Weg gelaufen, obwohl es eigentlich vom SQL Standard gefordert wird.

    Es geht kein Weg daran vorbei den Code rauszurücken und dann kann es immer noch sein, dass irgendein RLA Schinken der Verursacher ist.

    mfg

    Dieter Bender
    [/quote]

    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.287

    Post

    Hallo,

    diese Infos sind natürlich die wichtigsten, das deutet eindeutig auf einen Bug. Habt ihr eigentlich die Gruppen ptfs für die Database drin (DSPDTARA QSYS/SF99501 meine ich so aus dem Ärmel). Im übrigen kann das sogar an dem read only liegen, das erlaubt lokale Kopien, für die dann alle Sätze gebraucht werden.

    Aber wie auch immer: keine Work arounds, springt IBM auf die Füsse, das Betriebssystem und die Datenbank haben Geld gekostet.

    Dieter
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Apr 2002
    Beiträge
    24

    Post

    Ich hatte ja auch Probleme, wie im Thread "Dateileseprobleme" beschrieben. Am besten ist es, die Programm unter V5R1M0 neu zu kompilieren, dann wird es wahrscheinlich keine Probleme mehr geben. So war es jedenfalls bei meinem Dateiproblem.

    [Dieser Beitrag wurde von holli am 15. August 2002 editiert.]

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287

    Post

    Hallo,

    dieser Empfehlung kann ich mich nicht anschliessen. Wenn das was bringt, dann spricht das für eine ungeordnete Umgebung mit nicht reproduzierbaren Compiles. Sorry, dass mir keine mildere Beschreibung eingefallen ist.

    Dieter
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.245

    Post

    Dieses Problem habe ich auch schon bei V4R5.
    Bei COMMIT(*NONE) ist SQL nun mal so definiert, dass keine "schmutzigen" Read's ermöglicht werden.
    Wenn also auf einem Satz ein Lock vorliegt, kann SQL diesen Satz nun leider nicht lesen.
    Versuchen Sie es mit einem höheren Commit-Level, COMMIT(*CHG), so dass gelockte Daten auch gelesen werden können.

    IBM hat wohl diesen "Fehler" seit V4R5 korrigiert, so dass nun einige SQL's jetzt fehlschlagen.

    COMMIT(*CHG) kann auch ohne Journalisierung verwendet werden.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.287

    Post

    Hallo,

    es tut mir ja leid, dass ich ausgerechnet einem der Moderatoren widersprechen muss, aber ...

    Commit *NONE heisst, dass SQL keine Sätze sperrt, weder gelesene, noch geschriebene, gelesen wird alles, was share read zulässt. Hierfür ist keine Journalisierung erforderlich

    Commit *CHANGE heisst auch *UC für uncommited read, liest also alles, was share read zulässt und sperrt nur geschriebene Sätze bis Commit oder Rollback. hiermit kann man also nicht verhindern, dass ein Satz zwischen lesen und schreiben nicht von anderen verändert wird. Journal erforderlich!!!

    *CS wird auch read committed genannt, hier gibt es keine dirty reads mehr, beim Lesen über Cursor wird der aktuelle Satz beim Lesen gesperrt und beim Schreiben oder nächstem Lesen freigegeben. Ist dem Sperren in RLA ähnlich. erfordert ebenfalls Journalisierung.

    *ALL sperrt alle Sätze, egal ob gelesen oder geschrieben, bis Transaktionsende, keine dirty reads, Journal erforderlich.
    *RR entspricht ANSI Serializable, das heisst es wird so geschrieben, als ob man alleine auf der DB wäre; sperrt alles gelesen und geschriebene und legt einen Write Lock auf alle Tables, auf die geschrieben wurde, Sperren werden auch hier beim Commit/Rollback freigegeben, erfordert Journal. Das ist auf einer AS/400 normalerweise nicht einsetzbar, wegen RLA (Dateien mit update geöffnet) und idiotischer defaults beim CREATE TABLE bzw. CRTPF (waitfile *immed).

    Wenn wir denn bei idiotischen defaults sind; wait record 60 sec, das ist auch so einer.

    Ein Blick ins SQL Handbuch, oder in die Bedienerhilfe beim STRSQL oder CRTSQLxxx, wäre hier hilfreich!!!

    Dieter Bender

    ******************************************

    <BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>Original erstellt von Fuerchau:
    Dieses Problem habe ich auch schon bei V4R5.
    Bei COMMIT(*NONE) ist SQL nun mal so definiert, dass keine "schmutzigen" Read's ermöglicht werden.

    siehe oben!!!

    Wenn also auf einem Satz ein Lock vorliegt, kann SQL diesen Satz nun leider nicht lesen.

    siehe oben!!!

    Versuchen Sie es mit einem höheren Commit-Level, COMMIT(*CHG), so dass gelockte Daten auch gelesen werden können.

    IBM hat wohl diesen "Fehler" seit V4R5 korrigiert, so dass nun einige SQL's jetzt fehlschlagen.

    hier gab es keinen Fehler!!! allenfalls damages im OS (Gruppen PTFs einspielen!!!)


    COMMIT(*CHG) kann auch ohne Journalisierung verwendet werden.
    [/quote]

    siehe oben!!!

    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.245

    Post

    Auch Moderatoren sind nicht allwissend.

    Nach Einspielung der letzten DB-PTF's (V4R5) taucht der von mir beschriebene Fehler auch nicht mehr auf.
    Ist ein Datensatz durch eine andere Anwendung gesperrt (egal ob native oder per SQL), liest SQL jetzt auch diesen Satz (ohne Satzwartezeit).
    Selbst wenn ich einen "Select ... for update" kodiere, wird der Satz gelesen, aber halt ohne Sperre. Beim "update .. current of " wird dann erst ein SQL-Fehler ausgelöst.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Jul 2005
    Beiträge
    232
    Hallo, ich "grabe" diesen alten Thrad mal wieder aus, da ich ein Problem mit SQL Update auf gesperrte Sätze habe. Wie kann ich im SQL abfragen, das nur für diejenigen Sätze ein Update erfolgt, die gerade NICHT für ein anderes Programm / Job gesperrt sind.
    Beispiel:

    UPDATE <TABLE> SET FELDA = 'NEUER WERT'


    Es sollen aber nur diejenigen Sätze geändert werden, für die keine Sperre vorliegt. Geht das im SQL übehaupt?
    __________________________________
    -An eye for an eye leaves the whole world blind- -Mahatma Ghandi-

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.245
    Nein, das geht nicht.
    Hier gehts nach Try-and-Error, klappt der Update lag wohl keine Sperre vor ansonsten gibts einen SQLCOD.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 11:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •