pymysql遇到的坑,更新数据后,重新读取字段数据不更新

发布时间 2024-01-05 11:27:09作者: 观棋不雨

逻辑是这样的,判断一张表如果在指定时间内未更新数据,则结束循环。但是如果一直和数据库保持连接,会发现查询出来的结果一致不更新

原因在于:

  1. Mysql的存储引擎InooDB的事务隔离级别默认是 可重复读(Repeatable Read),例如A客户端事务未提交,而B客户端事务修改了数据,A客户端只能读取到小于等于当前事务版本号的数据(快照读),所以只有提交完事务后,开启新的事务中才能读取到新的数据。
  2. PyMysql模块的连接对象默认是没有自动提交事务的,需要我们用一个commite()方法才能提交,不像我们在MySQL客户端中,每次select,update,delete都帮我们自动提交事务,所以只要我们手动提交了事务,再重新select就可以查到新的数据。

解决方法:

方法一: 每次在用游标对象执行完查询语句后都手动提交

from pymysql import *
conn = connect(host=‘xxxx’, port=xxxx, database=‘xxxx’, user='root', password='123123', charse='utf8')
cursor = conn.cursor()
sql = ‘select * from xxx where id = 1’
# 开启事务
cursor.execute(sql)
# 手动关闭事务
conn.commit()
print(cursor.fetchone())   #数据a
# 再开启事务
cursor.execute(sql)
# 再关闭事务
conn.commit()
print(cursor.fetchone())   #更新后的数据

方法二.创建一个自动帮我们提交事务的连接对象

conn = connect(host='localhost', port=3306, database='smarthome', user='root', password='123123', charset='utf8’, autocommit=1)

这样就不用每次查数据都手动结束事务
但是修改数据要小心,因为自动提交,没有commit也会生效。