【问题标题】:Python MySQLdb not returning the result of last query?Python MySQLdb没有返回最后一次查询的结果?
【发布时间】:2018-09-19 01:23:11
【问题描述】:

所以我有一个使用 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 分钟没有对该确切条目的查询,则查询返回与上次查询相同的值。但是在第二次查询之后,就像一秒钟后,它返回了新值。

这是为什么呢?是my code 还是查询的问题?可能是缓存没有清空,第二次返回?

我也试过只运行两次查询,但仍然存在同样的问题。 同样摆脱提交调用不会改变任何东西,并且两次获取也不会改变它。

【问题讨论】:

标签: python mysql python-3.x mysql-python


【解决方案1】:

mysql-python 的默认设置是 autocommit=False。这意味着您的查询隐式启动事务,您需要显式调用 commit 来提交对数据库的更改。

如果您使用 REPEATABLE READ 隔离级别运行,您将不会看到来自其他事务的更改。当您调用getUserPoints 时,第一个选择位于旧事务中,因此您将获得旧值。然后事务被提交,所以当你再次调用getUserPoints 时,你会得到更新的值。

autocommit=False 行为可能不直观。例如,Django 默认为 autocommit=True,they recommend READ COMMITTED 隔离级别而不是 REPEATABLE READ(MySQL 的默认值)。

【讨论】:

  • 所以你是说我应该将我的隔离级别更改为已提交读?或者一次查询大约 120 个查询然后等待一个小时的最佳选择是什么?
  • 您绝对应该考虑更改为 autocommit=True 并将隔离级别更改为 READ COMMITTED。我不会说你应该做出这些改变。您需要考虑可能的影响。例如,如果您更改为 autocommit=True,则在需要时由您明确启动事务。
  • 所以我每次更改时都必须致电qServer.execute("START TRANSACTION")?或者这只是一个查询示例?
  • 这离题了。不,如果您更改为autocommit=True,那么您的查询将被自动提交。如果您有两个要在事务中运行的查询(例如,它们都应该成功或都应该回滚),那么由您来启动和提交/回滚事务。
猜你喜欢
  • 2013-06-19
  • 2018-03-22
  • 2016-08-22
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 2010-11-13
  • 1970-01-01
相关资源
最近更新 更多