所以我有一个使用MySQLdb的函数:
def getUserPoints(uid):
qServer.execute("SELECT points FROM TS3_STAMM_1 WHERE ts3_uid=%s", (uid,))
qConn.commit()
r = int(qServer.fetchall()[0][0])
return r
返回一个unsigned int。
现在发生了两件事:
如果我省略qConn.commit()
它将始终返回相同的值,即使mySQL数据库上的值发生了变化。 (但不仅仅是改变事情的提交电话吗?)
而且,由于某种原因,如果超过10分钟没有查询该确切条目,则查询返回与上一个查询相同的值。但是在第二次查询之后,它会返回新值。
为什么?这是my code或查询的问题吗?也许有一个缓存没有被清除并在第二次返回?
我也尝试过两次运行查询,但仍然存在同样的问题。 同时摆脱提交调用不会改变任何东西,并且两次提取也不会改变它。
答案 0 :(得分:2)
mysql-python的默认值是autocommit = False。这意味着您的查询隐式启动事务,您需要明确调用commit来提交对数据库的更改。
如果您使用REPEATABLE READ隔离级别运行,则不会看到其他事务的更改。当您致电getUserPoints
时,第一个选择位于旧交易中,因此您将获得旧值。然后提交事务,以便在再次调用getUserPoints
时获得更新的值。
autocommit = False行为可能不直观。例如,Django默认为autocommit = True,而they recommend为READ COMMITTED隔离级别,而不是REPEATABLE READ(MySQL的默认值)。