jmi*_*loy 8 python mysql session caching wsgi
我的python/wsgi网络应用程序中的会话有问题.每个2个wsgi守护进程中的每个线程都有一个不同的,持久的mysqldb连接.有时,在删除旧会话并创建新会话后,某些连接仍然会在select中获取旧会话,这意味着它们无法验证会话并再次请求登录.
详细信息:会话存储在本地mysql数据库的InnoDB表中.验证(通过CAS)之后,我删除该用户的任何以前的会议中,创建一个新的会话(插入行),提交事务,并重定向到最初请求的页面与Cookie中的新的会话ID.对于每个请求,将根据数据库中的会话检查cookie中的会话ID.
有时,重定向后在数据库中找不到新创建的会话.相反,该用户的旧会话仍然存在.(我通过选择并记录每个请求开头的所有会话来检查这一点).不知何故,我得到了缓存的结果.我尝试用SQL_NO_CACHE选择会话,但没有区别.
为什么我得到缓存结果?还有什么地方可以进行缓存,以及如何阻止缓存或刷新缓存?基本上,为什么其他连接无法看到新插入的数据?
a_h*_*ame 13
MySQL默认为隔离级别"REPEATABLE READ",这意味着您不会在事务开始后看到事务中发生的任何更改 - 即使这些(其他)更改已提交.
如果在这些会话中发出COMMIT或ROLLBACK,您应该看到更改的数据(因为这将结束"正在进行中"的事务).
另一种选择是将这些会话的隔离级别更改为"READ COMMITTED".也许有一个选项可以更改默认级别,但您需要检查手册.
小智 5
是的,看起来假设您只会执行一个事务,然后断开连接。如果您有不同的需求,那么您需要解决这个假设。正如 @a_horse_with_no_name 所提到的,您可以进行提交(尽管如果您实际上没有更改数据,我会使用回滚)。或者您可以更改游标上的隔离级别 - 在本次讨论中我使用了以下内容:
dbcursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")
或者,您似乎可以在连接上将自动提交设置为 true:
dbconn.autocommit(True)
不过,如果实际对连接进行更改,则不建议这样做。