Warum wählen einige MySQL-Verbindungen nach dem Löschen + Einfügen alte Daten der MySQL-Datenbank aus?
P粉882357979
P粉882357979 2023-10-30 12:37:20
0
2
582

Ich habe Probleme mit Sitzungen in meiner Python-/WSGI-Webanwendung. Jeder Thread in den beiden WSGI-Daemons verfügt über eine andere, dauerhafte MySQLDB-Verbindung. Manchmal wird nach dem Löschen der alten Sitzung und dem Erstellen einer neuen Sitzung bei einigen Verbindungen immer noch die alte Sitzung ausgewählt, was bedeutet, dass sie die Sitzung nicht authentifizieren und um eine erneute Anmeldung bitten.

Details: Sitzungen werden in einer InnoDB-Tabelle in einer lokalen MySQL-Datenbank gespeichert. Nach der Authentifizierung (über CAS) lösche ich alle vorherigen Sitzungen für diesen Benutzer, erstelle eine neue Sitzung (füge eine Zeile ein), übergebe die Transaktion und leite mithilfe der neuen Sitzungs-ID aus dem Cookie zur ursprünglich angeforderten Seite weiter. Bei jeder Anfrage wird die Sitzungs-ID im Cookie mit der Sitzung in der Datenbank verglichen.

Manchmal werden neu erstellte Sitzungen nach der Umleitung nicht in der Datenbank gefunden. Stattdessen existiert diealteSitzung des Benutzers noch. (Ich habe dies überprüft, indem ich zu Beginn jeder Anfrage alle Sitzungen ausgewählt und protokolliert habe.) Irgendwie erhalte ich zwischengespeicherte Ergebnisse. Ich habe versucht, SQL_NO_CACHE zu verwenden, um die Sitzung auszuwählen, aber es machte keinen Unterschied.

Warum erhalte ich zwischengespeicherte Ergebnisse? Wo sonst kann es zum Caching kommen und wie kann ich es stoppen oder den Cache leeren? Warum können andere Verbindungen grundsätzlich die neu eingefügten Daten nicht sehen?

P粉882357979
P粉882357979

Antworte allen (2)
P粉696891871

是的,看起来假设您只会执行一个事务,然后断开连接。如果您有不同的需求,那么您需要解决这个假设。正如 @a_horse_with_no_name 所提到的,您可以进行提交(尽管如果您实际上没有更改数据,我会使用回滚)。或者您可以更改光标上的隔离级别 - 来自这个讨论我用过这个:

dbcursor.execute("设置会话事务隔离级别读取已提交")

或者,看起来您可以在连接上将自动提交设置为 true:

dbconn.autocommit(True)

不过,如果实际对连接进行更改,则不建议这样做。

    P粉545956597

    MySQL 默认隔离级别“REPEATABLE READ”,这意味着您不会看到事务启动后所做的任何更改 - 即使这些(其他)更改已提交。

    如果您在这些会话中发出 COMMIT 或 ROLLBACK,您应该会看到更改的数据(因为这将结束“正在进行的”事务)。

    另一个选项是将这些会话的隔离级别更改为“READ COMMITTED”。也许还有一个选项可以更改默认级别,但您需要查看手册。

      Neueste Downloads
      Mehr>
      Web-Effekte
      Quellcode der Website
      Website-Materialien
      Frontend-Vorlage
      Über uns Haftungsausschluss Sitemap
      Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!