所以我有一个使用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
返回一个无符号整数。
现在发生了两件事:如果我把 qConn.commit()
它总是返回相同的值,即使mysql数据库上的值发生了变化(但是提交调用不只是为了改变事情吗?)
而且,出于某种原因,如果在10分钟内没有对该确切条目进行查询,则查询返回与上次查询相同的值。但是在第二次查询(比如第二次查询)之后,它会返回新的值。
为什么?是我的代码问题还是查询问题?可能有一个缓存没有被清除并且在第二次返回?
我也试过运行两次查询,但仍然存在相同的问题。另外,摆脱提交调用不会改变任何事情,两次获取也不会改变任何事情。
1条答案
按热度按时间fdbelqdn1#
mysql python的默认值是autocommit=false。这意味着您的查询隐式地启动事务,您需要显式地调用commit来提交对数据库的更改。
如果使用可重复读取隔离级别运行,则不会看到来自其他事务的更改。当你打电话的时候
getUserPoints
,第一个select在旧事务中,因此您将获得旧值。然后事务被提交,因此在调用时得到更新的值getUserPoints
再一次。autocommit=false行为可能是不直观的。例如,django的默认值为autocommit=true,他们建议使用readcommitted隔离级别,而不是repeatableread(mysql的默认值)。