python mysql -选择需要commit()吗?

7gcisfzg  于 2023-01-12  发布在  Mysql
关注(0)|答案(1)|浏览(129)

我有一个非常简单的python代码从mysql获取一些数据:

version = 1
    with conn.cursor() as cur:
        query = f'select latest_version from version'
        cur.execute(query)
        for row in cur:
            version = int(row[0])      
    cur.close()
    print(version)

这段代码是从访问我的私有mysql示例的AWS Lambda执行的(但这些都不重要)。
它工作得非常好,然后我用SQL更新了DB中的版本值:

UPDATE version set latest_version=11;
COMMIT;
FLUSH TABLES;

问题是:在运行上述SQL代码后,当我运行Python代码时,我从DB中获取旧值(10而不是11),就像一些缓存......
现在,当我添加到我的python代码commit()如下:

version = 1
    with conn.cursor() as cur:
        query = f'select latest_version from version'
        cur.execute(query)
        conn.commit()
        for row in cur:
            version = int(row[0])      
    cur.close()
    print(version)

这一切开始工作正常,我得到了一个新的版本。
这个问题对我来说在不同的SQL表中发生了几次(不得不使用上面的"变通方法")。总是相同的结果,测试了很多次。
我有相当多的其他代码在该数据库上运行,在其他表上运行大量的插入(但我从来没有通过python代码在版本表上插入)。而且我相当密集地运行这些工人在许多并行线程中同时在同一数据库上运行(但没有依赖关系,不应该有任何死锁,所有工人及时完成工作)。
你能帮我弄明白为什么会这样吗?
我的一个猜测是我没有在其他脚本中正确地关闭与mysql的连接,但在这种情况下,我猜我会耗尽连接/数据库处理程序(工人),并且将无法再连接,无法获得缓存值...所以我在这里一无所知。
谢谢你,

nkoocmlb

nkoocmlb1#

实际情况是,默认的事务隔离是REPEATABLE-READ,因此同一事务中的重复查询永远不会看到更新的数据库视图。
应将事务隔离设置为READ-COMMITTED,以便SELECT始终看到当前提交的数据。在执行第一次查询之前,请执行以下操作:

cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")

如果这不起作用,那么在更改隔离级别之后执行一次COMMIT。
在这种情况下,您不需要执行“刷新表”。

相关问题