Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Zeilenkonflikte verursachen Deadlock-Fehler in JMS-Anwendungen mit hohem Durchsatz

Ein Deadlock impliziert, dass jeder Thread versucht, mehrere Zeilen in einer einzigen Transaktion zu aktualisieren, und dass diese Aktualisierungen in einer anderen Reihenfolge über die Threads hinweg durchgeführt werden. Die einfachste mögliche Antwort wäre daher, den Code so zu ändern, dass Nachrichten innerhalb derselben Transaktion in einer definierten Reihenfolge (d. h. in der Reihenfolge des Primärschlüssels) angewendet werden. Das würde sicherstellen, dass Sie niemals einen Deadlock bekommen würden, obwohl Sie immer noch blockierende Sperren bekommen würden, während ein Thread darauf wartet, dass ein anderer Thread seine Transaktion festschreibt.

Wenn wir einen Schritt zurückgehen, erscheint es unwahrscheinlich, dass Sie wirklich möchten, dass viele Threads dieselbe Zeile in einer Tabelle aktualisieren, wenn Sie die Reihenfolge der Aktualisierungen nicht vorhersagen können. Es scheint sehr wahrscheinlich, dass dies zu vielen verlorenen Updates und einem eher unvorhersehbaren Verhalten führen würde. Was genau macht Ihre Anwendung, die so etwas sinnvoll machen würde? Tun Sie so etwas wie das Aktualisieren von aggregierten Tabellen nach dem Einfügen von Zeilen in eine Detailtabelle (d. h. Aktualisieren der Anzahl der Aufrufe eines Beitrags zusätzlich zum Protokollieren von Informationen zu einem bestimmten Aufruf)? Wenn ja, müssen diese Operationen wirklich synchron sein? Oder könnten Sie die Anzahl der Aufrufe regelmäßig in einem anderen Thread aktualisieren, indem Sie die Aufrufe der letzten N Sekunden zusammenfassen?