Race Condition im Joomla Befehl „insertid()“?

  • Hallo zusammen,


    nutzt Joomla persistente Datenbankverbindungen?


    Könnte ein PHP-Prozess A bei einer hohen Datenbankauslastung durch den Joomla Befehl „insertid()“ ausversehen die ID eines anderen PHP Prozesses B bekommen, der kurz nach dem Prozess A ein INSERT auf die gleiche Tabelle ausgeführt hat? Oder kurz gesagt: Kann es bei einer ausgelasteten Datenbank eine Race Condition im Joomla Befehl „insertid()“ kommen?


    Nutzt der Joomla Befehl „insertid()“ die MySQL Funktion "LAST_INSERT_ID()", wenn eine MySQL Datenbank genutzt wird?

  • Nutzt der Joomla Befehl „insertid()“ die MySQL Funktion "LAST_INSERT_ID()",wenn eine MySQL Datenbank genutzt wird?

    Durchsuchst du den libraries/joomla/database/-Ordner nach

    Code
    function insertid()

    , dann siehst du, was verwendet wird, eben je nach eingestelltem Datenbank-Typ (Joomla-Konfiguration).


    https://github.com/joomla/joom…es/joomla/database/driver


    MySQLi z.B.

    Code
    mysqli_insert_id($this->connection);


    Zum Rest: Ich sags mal so, "Joomla wäre Sch..., wenn es nicht in der Lage wäre, mehrere Datenbank-Prozesse sauber voneinander zu trennen bzw. diese durcheinander bringt". Joomla läuft auch auf sehr belasteten Websites mit vielen vielen vielen gleichzeitigen DB-Prozessen/Verbindungen.


    Wenn man Erweiterungen verwendet, die mehrere ermittelte insertIds bzw. DB-Prozesse wegen falscher Programmierung durcheinanderbringt, dann halt...

  • Bei uns läuft insertid() über function mysqli_insert_id ($link) {} in der mysqli\mysqli.php laut Joomla-Konfiguration.

    Aber in der Funktionsbeschreibung steht nur "int|string The value of the AUTO_INCREMENT field that was updated by the previous query." Ob aber die MySQL Funktion "LAST_INSERT_ID()" genutzt wird steht nicht da.

    Nutzt Joomla immer eine eigene persistente DB-Verbindung pro User Session, um eine Race Condition im Joomla Befehl „insertid()“ zu verhindern?

  • Bei uns läuft insertid() über function mysqli_insert_id ($link) {} in der mysqli\mysqli.php laut Joomla-Konfiguration.

    Aber in der Funktionsbeschreibung steht nur "int|string The value of the AUTO_INCREMENT field that was updated by the previous query." Ob aber die MySQL Funktion "LAST_INSERT_ID()" genutzt wird steht nicht da.

    Nutzt Joomla immer eine eigene persistente DB-Verbindung pro User Session, um eine Race Condition im Joomla Befehl „insertid()“ zu verhindern?

    PHP nutzt dafür die entsprechende Funktion der zugehörigen C-Library: https://dev.mysql.com/doc/refman/8.0/en/mysql-insert-id.html

    Zitat aus der Doku: The value of mysql_insert_id() is affected only by statements issued within the current client connection. It is not affected by statements issued by other clients.


    Wenn die DB-Verbindung also persistent bleibt, stimmt der Wert. Joomla versucht innerhalb eines Seitenaufrufs die gleiche DB-Connection zu nutzen, es gibt aber Umstände die dazu führen, dass die Verbindung zwischendrin resettet wird und neu aufgebaut werden muss. Seitenaufruf-übergreifende Persistenz gibt es in der Regel nicht.

  • Zitat

    Joomla versucht innerhalb eines Seitenaufrufs die gleiche DB-Connection zu nutzen, es gibt aber Umstände die dazu führen, dass die Verbindung zwischendrin resettet wird und neu aufgebaut werden muss.

    Das bedeutet, dass Joomla pro Seitenaufruf eine eigene DB-Verbindung aufbaut. Daher könnte es nicht passieren, dass Client 1 und Client 2 sich dieselbe DB-Verbindung teilen?