Python MySQLdb不返回上次查询的结果?
因此,我有一个使用MySQLdb的函数:Python MySQLdb不返回上次查询的结果?,python,mysql,python-3.x,mysql-python,Python,Mysql,Python 3.x,Mysql Python,因此,我有一个使用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(),它将始终返回相同的值,即使
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分钟以上没有对该确切条目进行查询,则查询将返回与上次查询相同的值。但在第二次查询(如第二次查询)后,它将返回新值
为什么呢?这是问题还是疑问?可能有一个缓存未被清除,并在第二次返回
我也试过运行两次查询,但仍然存在相同的问题。
另外,取消提交调用不会改变任何事情,两次获取也不会改变任何事情。mysql python的默认设置是autocommit=False。这意味着您的查询隐式地启动事务,您需要显式地调用commit来提交对数据库的更改 如果使用可重复读取隔离级别运行,则不会看到来自其他事务的更改。调用
getUserPoints
时,第一个选择在旧事务中,因此您可以获得旧值。然后事务被提交,因此当您再次调用getUserPoints
时,您将获得更新的值
autocommit=False行为可能是不直观的。例如,Django的默认值为autocommit=True,读取提交隔离级别而不是可重复读取(MySQL的默认值)。您可能会发现这很有用。那么您是说我应该将隔离级别更改为读取提交?或者,立即查询大约120个查询,然后将其保留一个小时的最佳选项是什么?应该明确地考虑更改为自动提交=真,并更改隔离级别以读取已提交的内容。我甚至不会说你应该做那些改变。你需要仔细考虑可能产生的影响。例如,如果您更改为
autocommit=True
,则在需要时由您显式启动事务。因此每次更改某些内容时,我都必须调用qServer.execute(“启动事务”)
?或者这只是一个查询的例子?这是离题了。否,如果您更改为autocommit=True
,则您的查询将自动提交。如果您希望在事务中运行两个查询(例如,它们都应成功或都应回滚),则由您启动并提交/回滚事务。