Python MySQLdb查询无法返回最新结果?技术问题咨询
解答你的MySQLdb查询问题
让我来拆解你遇到的两个问题,这都是MySQL事务机制和MySQLdb默认配置带来的常见“坑”:
问题1:为什么查询操作需要qConn.commit()才能读到最新数据?
你说得没错——commit()确实主要用于**写操作(INSERT/UPDATE/DELETE)**来提交事务,但这里的情况和MySQL的默认事务隔离级别有关:
MySQL默认的事务隔离级别是REPEATABLE READ(可重复读),在这个级别下,一旦事务开始,所有查询都会基于事务启动时的数据库快照来返回结果,哪怕其他事务已经修改并提交了数据,当前事务内的查询还是会读到旧的快照。
而qConn.commit()的作用在这里是结束当前事务,触发MySQL开启一个新的事务。新事务会重新获取最新的数据库快照,所以下一次查询就能读到更新后的数据了。
问题2:查询总是返回上一次的结果
这其实是问题1的延伸:因为你的函数每次调用都在同一个未结束的事务里执行,所以重复查询会一直复用事务启动时的旧快照,自然只会返回上一次的结果。
解决方案(三种可选)
根据你的场景(只读查询,返回单个整数),推荐以下几种优化方式:
方案1:开启自动提交(最简单)
MySQLdb默认autocommit是关闭的,你可以在建立连接后开启自动提交,这样每个查询都会自动结束事务,每次都能读到最新数据:
# 建立连接后添加这一行 qConn.autocommit(True) def getUserPoints(uid): qServer.execute("SELECT points FROM TS3_STAMM_1 WHERE ts3_uid=%s", (uid,)) r = int(qServer.fetchall()[0][0]) return r
方案2:查询后执行rollback()替代commit()
因为是只读查询,不需要提交任何修改,用rollback()也能结束当前事务,释放旧快照,让下一次查询使用新的快照:
def getUserPoints(uid): try: qServer.execute("SELECT points FROM TS3_STAMM_1 WHERE ts3_uid=%s", (uid,)) r = int(qServer.fetchall()[0][0]) return r finally: # 结束事务,无需提交修改 qConn.rollback()
方案3:调整事务隔离级别为READ COMMITTED
如果你不想开启自动提交,也可以把隔离级别改成READ COMMITTED,这样在同一个事务里,每次查询都会读取最新的已提交数据:
# 建立连接后设置隔离级别 qConn.set_isolation_level(1) # 1对应MySQL的READ COMMITTED级别 def getUserPoints(uid): qServer.execute("SELECT points FROM TS3_STAMM_1 WHERE ts3_uid=%s", (uid,)) r = int(qServer.fetchall()[0][0]) return r
内容的提问来源于stack exchange,提问作者JH_WK
相关产品推荐
相关产品推荐

