这个 Python 查询怎么可能在两个不同的结果之间交替?

How is it possible for this Python query to alternate between two different results?

我正在执行以下代码,

import psycopg2
import pandas as pd

@contextmanager
def get_psyopg2_connection(server='my_server', port=1234, read_only=True):
    try:
        conn = psycopg2.connect("<connection_string>")
        conn.set_session(readonly=read_only, autocommit=True)
        yield conn
    except Exception as e:
        raise Exception(e) from e
    finally:
        conn.close()

if __name__=="__main__":

    with get_psyopg2_connection() as conn_dev:

        df = pd.read_sql("""select last_value from public.lime_boxes_id_seq""", conn_dev)
        print(df)

我收到了两个不同的结果; last_value = 6(正确)和 33(错误)。当我多次 运行 相同的代码时,我可能会得到像 6, 6, 6, 33, 33, 6 这样的结果序列。它是 unpredictable.

当我在 DBeaver 中执行这个查询时,我总是得到 6。

怎么会这样?

编辑:

这个 table 是一个序列,除了我自己,没有人访问这个模式。内容在这里

last_value log_cnt is_called
6 27 true

有 3 种不同的可能性对我来说很突出:

  1. public.lime_boxes_id_seq中有多条记录,由于你没有指定ORDER BY子句,数据库不会保证返回记录的顺序。虽然这绝对是一种低可能性,但仍然值得探索 table 被查询 实际上 包含哪些数据并从那里开始工作。

  2. 有问题的数据库服务器(my_server)实际上是它后面的一组 Postgres 节点的某种负载平衡器,并且有一个或多个节点与其余部分不同步并返回 old/incorrect 数据。 这将完全解释您的 DBeaver 客户端每次获得相同结果的原因(可能不是 connecting/disconnecting/reconnecting 在查询之间,每次都可能连接到不同的服务器,并且可能在查询之间保持相同的连接),但您的代码(每次执行 connects/disconnects/reconnects )不会。为了缓解这种情况,您可以连接到集群中已知良好的节点(如果您的网络设置允许这样的安排),或者修复导致数据陈旧的复制问题。

  3. 如果所讨论的值曾经是 33,则可能 在您的代码和 Postgres 中的 table 之间的网络中存在某种缓存机制正在返回此错误数据。 如果它被此 appliance/these 设备缓存并且此后未被刷新,这也可能是此数据未返回您认为的内容的原因应该,缓存 flush/reconfiguration 是必要的。