今天做一个监控后台数据库数据的程序中,使用了pymysql,但是在每次使用游标对象select对象时数据都是一个样。
原因在于:1. Mysql的存储引擎InooDB的事务隔离级别默认是 可重复读(Repeatable Read),例如A客户端事务未提交,而B客户端事务修改了数据,A客户端只能读取到小于等于当前事务版本号的数据(快照读),所以只有提交完事务后,开启新的事务中才能读取到新的数据。
2. PyMysql模块的连接对象默认是没有自动提交事务的,需要我们用一个commite()方法才能提交,不像我们在MySQL客户端中,每次select,update,delete都帮我们自动提交事务,所以只要我们手动提交了事务,再重新select就可以查到新的数据。
解决方法:
方法一: 每次在用游标对象执行完查询语句后都手动提交
from pymysql import *
con = connect(host = ‘xxxx’, port = xxxx, database = ‘xxxx’, user = 'root', password = '123123', charset = 'utf8')
cs = con.cursor()
sql = ‘select * from xxx where id = 1’
# 开启事务
cs.execute(sql)
# 手动关闭事务
con.commit()
print(cs.fetchone()) #数据a
# 再开启事务
cs.execute(sql)
# 再关闭事务
con.commit()
print(cs.fetchone()) #更新后的数据
方法二.创建一个自动帮我们提交事务的连接对象
con = connect(host = 'localhost', port = 3306, database = 'smarthome', user = 'root', password = '123123', charset = 'utf8’, autocommit = 1)
这样就不用每次查数据都手动结束事务
但是修改数据要小心,因为自动提交,没有commit也会生效。