为什么有一些mysql连接在删除+插入后选择mysql数据库中的旧数据?

时间:2012-02-16 20:09:36

标签: python mysql session caching wsgi

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

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

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

为什么我会获得缓存结果?还有什么地方可以进行缓存,以及如何阻止缓存或刷新缓存?基本上,为什么其他连接无法看到新插入的数据?

2 个答案:

答案 0 :(得分:12)

MySQL默认为隔离级别" REPEATABLE READ"这意味着您不会在事务开始后看到事务中发生的任何更改 - 即使这些(其他)更改已提交。

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

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

答案 1 :(得分:2)

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

dbcursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")

或者,看起来您可以在连接上将auto commit设置为true:

dbconn.autocommit(True)

但是,如果实际在连接中进行了更改,则不建议这样做。