- 近期遇到一个奇怪的问题:数据库中对信息进行修改后,pymysql读到的依然是修改前的信息,一开始以为是在什么我不知道的地方做了缓存,后来在百度上找到了答案,特此记录。
- 信息来源:为什么pymysql重连后才能查到被其他地方修改的数据 pymysql缓存?
问题代码
lock.acquire()
cursor = self.conn.cursor()
cursor.execute(sql)
data = cursor.fetchall()
#self.conn.commit()
lock.release()
unlock_time = time.time()
cursor.close()
问题原因
mysql数据库的默认存储引擎是(InnoDB)。事务隔离级别是(REPEATABLE READ),它可以防止任何被查询的行被其他事务更改,从而阻止不可重复的读取,而不是 幻读取。它使用中度严格的锁定策略,以便事务内的所有查询都会查看同一快照中的数据,即数据在事务开始时的数据。当创建查询事务时,事务一直没有进行更新,每次查询到的数据都是之前查询结果的快照,因此查询到的一直都是更新前的结果。
解决方案
方案1: 每次查询后进行commit()操作,进行事务更新。
方案2:创建connect连接时,autocommit=True
,自动进行commit提交。
方案3:修改事务隔离级别(不推荐)
网友评论