Frage

Ich halte laufe in „enq: TX - Zeilensperre Anstoß“, wenn ich den SQL-Befehl unten in einem Oracle 9 DB laufen. Die Tabelle mytable ist ein kleiner Tisch, mit weniger als 300 Zeilen.

UPDATE MYTABLE
SET     col1 = col1 + :B3 ,
        col2    = SYSDATE
WHERE   :B2            = col3
    AND :B1        = col4

Ich betreiben 10 Threads zur gleichen Zeit, und einige warten so lange wie 10 Sekunden, um eine Chance zu bekommen, zu aktualisieren. Ich weiß, ich werde diese Deadlock Frage stellen, aber das Problem für mich ist, dass sie in der Lage sein sollten, viel schneller zu sein, da die Tabelle klein ist, so zu aktualisieren es schnell sein würde.

Bearbeiten : Ich habe diesen Code nicht ändern kann, ist es in einer Drittanwendung. Ich kann nur die DB zwicken.

Was kann ich tun, um die Geschwindigkeit der Dolle Warteschlange zu verbessern?    Wie kann ich diese Wartezeit verbessern, so meine Threads schneller laufen?

War es hilfreich?

Lösung

Wenn Sie nicht wollen, versuchen Sie nicht blockiert werden blind zu aktualisieren. Führen Sie eine SELECT FOR UPDATE NOWAIT zuerst. Wenn Sie eine Ausnahme (ORA-00054) zu erhöhen, bedeutet dies, dass eine weitere Sitzung zur Zeit mit dieser Reihe arbeitet. In diesem Fall, je nach Ihrer Anforderung, können Sie versuchen, eine andere Zeile zu aktualisieren (versuchen Sie eine Warteschlange / dequeue Prozess zu bauen?), Warten (dbms_lock.sleep) oder eine Fehlermeldung an die anrufende App zurück.

Sie werden nie vor einer Sackgasse, wenn Sie die Zeile mit FOR UPDATE NOWAIT ersten sperren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top