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

Python 为什么有些mysql连接会在删除+插入后选择mysql数据库中的旧数据?,python,mysql,session,caching,wsgi,Python,Mysql,Session,Caching,Wsgi,我的python/wsgi web应用程序中的会话有问题。在2个wsgi守护进程的每个进程中,每个线程都有一个不同的、持久的mysqldb连接。有时,在删除旧会话并创建新会话后,某些连接仍会在select中获取旧会话,这意味着它们无法验证会话并再次请求登录 详细信息:会话存储在本地mysql数据库的InnoDB表中。在通过CAS进行身份验证之后,我删除该用户以前的任何会话,创建新会话插入一行,提交事务,并使用cookie中的新会话id重定向到最初请求的页面。对于每个请求,将根据数据库中的会话检查

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

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

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


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

MySQL默认为隔离级别的可重复读取,这意味着您不会看到事务启动后所做的任何更改,即使这些其他更改已提交

如果在这些会话中发出提交或回滚,则应该看到更改的数据,因为这将结束正在进行的事务


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

是的,假设您只执行一个事务,然后断开连接。如果你有不同的需求,那么你需要绕过这个假设。正如@a_horse_和_no_name所提到的,您可以输入一个commit,尽管如果您实际上没有更改数据,我会使用回滚。或者您可以更改光标上的隔离级别-从我使用的:

dbcursor.executeSET会话事务隔离级别读取已提交

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

dbconn.AUTOCOMMITRUE


不过,如果确实在连接中进行了更改,也不建议这样做。

我会在上面编辑的插入之后提交。你的意思是我也应该在其他连接中提交或回滚吗?是的,你需要结束另一个会话打开的事务或更改隔离级别。很好,我在每个请求的开头添加了一个提交,这似乎起到了作用。也许在最后做会更好,但无论如何。。。如果它能坚持一两天,我会回来把它标记为正确的。将提交移到最后,并改变了等待标记为正确的想法。。。似乎完全固定了。谢谢,不客气。您可能还需要查看手册以更改默认隔离级别。然后你就可以不用提交了,我不得不使用db.autocommitTrue,即使在我刚刚做选择的时候,底层的表在我的脚本之外被更改了。谢谢你的提问,伙计