为什么一些mysql连接在删除+插入后选择mysql数据库的旧数据?
P粉882357979
P粉882357979 2023-10-30 12:37:20
0
2
713

我的 python/wsgi Web 应用程序中的会话出现问题。 2 个 wsgi 守护进程中的每个线程都有一个不同的、持久的 mysqldb 连接。有时,在删除旧会话并创建新会话后,某些连接仍然会在选择中获取旧会话,这意味着它们无法验证会话并要求再次登录。

详细信息:会话存储在本地 mysql 数据库的 InnoDB 表中。身份验证(通过 CAS)后,我删除该用户以前的任何会话,创建一个新会话(插入一行),提交事务,并使用 cookie 中的新会话 ID 重定向到最初请求的页面。对于每个请求,都会根据数据库中的会话检查 cookie 中的会话 ID。

有时,重定向后在数据库中找不到新创建的会话。相反,该用户的会话仍然存在。 (我通过在每个请求开始时选择并记录所有会话来检查这一点)。不知何故,我得到了缓存的结果。我尝试使用 SQL_NO_CACHE 选择会话,但没有什么区别。

为什么我会得到缓存结果?缓存还可能在哪里发生,如何停止它或刷新缓存?基本上,为什么其他连接无法看到新插入的数据?

P粉882357979
P粉882357979

全部回复(2)
P粉696891871

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

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

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

dbconn.autocommit(True)

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

P粉545956597

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!