Announcement

Collapse
No announcement yet.

SQL Server 2000; U- oder X-Zeilensperre auf genau einem Datensatz erzeugen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Server 2000; U- oder X-Zeilensperre auf genau einem Datensatz erzeugen

    Hallo,

    wie erhält man eine U- oder X-Zeilensperre auf genau einem Datensatz?

    Bei meinen erfolglosen Versuchen bin ich wie folgt vorgegangen.

    Verwendet wurde eine Tabelle mit einem Primärschlüssel PK mit mehreren Feldern (MSSQL => Eindeutiger gruppierter Index).
    Die SQL-Statements SELECT WITH (UPDLOCK, ROWLOCK), DELETE WITH (ROWLOCK), INSERT WITH (ROWLOCK) und UPDATE WITH (ROWLOCK) wurden mit festgelegtem PK über eine JDBC-Connection mit Isolation-Level READ_COMMITTED innerhalb einer manuellen Transaktion ausgeführt. Beim SELECT wurden die Parametereinstellungen ResultSet.CONCUR_READ_ONLY, ResultSet.TYPE_FORWARD_ONLY, MaxRows = 1 und FetchSize =1 verwendet. Für Dauer der Transaktion wurde eine U- oder X-Sperre auf genau dem Datensatz der durch den PK identifiziert wird erwartet. Gesperrt wurde aber ein Schlüsselbereich. Der Schlüsselbereich wird scheinbar durch den Wert im ersten Feld des verwendeten PK (Index) bestimmt. In der Tabelle wurden alle Datensätze mit dem selben Wert in der PK-Feld-Spalte gesperrt.

    Über Tipps würde ich mich freuen.

    Gruß
    Bunsoft2006

  • #2
    Hallo,
    der MS SQL Server eskaliert (so wie die meisten anderen SQL-Datenbanken auch) je nach erzeugter Last eine angeforderte Sperre auf den jeweils höheren Bereich (Page, Extend, Table, Database), wenn der jeweils kleinere Sperrbereich einen zu großen Verwaltungsaufwand nach sich ziehen würde. Außerdem spielt es im Fall des MS SQL Server eine Rolle, ob ein CLUSTERED INDEX oder ein NONCLUSTERED INDEX (oder beide) betroffen sind. Bei einem aus mehreren Spalten zusammengesetzten Primärschlüssel wird es an dieser Stelle nicht einfacher (...Bewertung des Verwaltungsaufwands...).
    <br>
    &gt;Über Tipps würde ich mich freuen.
    Es gibt mehrere Alternativen: Zum einen die separate (klassische) Sperr-Tabelle, die nur ein Verzeichnis der aktuell "reservierten" Datensätze speichert und auf die X-Locks vom SQL Server verzichtet. Und zum anderen den Hack, die Datensatz- bzw. Index-Größe künstlich so aufzublähen, dass immer nur ein Datensatz auf eine Page passt :-)
    &#10

    Comment


    • #3
      Vielen Dank für Deine Antwort.

      Hier noch weitere Informationen.
      In der Tabelle master.syslockinfo befindet sich pro Datensatz (ob 10, 1000, 100000 Sätze) ein Eintrag mit U- oder X-Lock-Vermerk. Die Datensätze erstrecken sich über mehrere Pages.

      Ein Problem des Verwaltungsaufwandes kann es nicht sein. Die DB wäre schon nach einem Lock-Vermerk auf dem Datensatz zum PK fertig. Warum die Mehrarbeit der DB?

      Gruß
      Bunsoft200

      Comment

      Working...
      X