结束选择事务psycopg2和postgres

2024-06-28 14:31:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用psycopg2对postgres数据库执行许多SELECT查询,但是我得到了ERROR: Out of shared memory。它建议我应该增加max_locks_per_transaction.,但这让我很困惑,因为每个SELECT查询只在一个表上操作,而且max_locks_per_transaction已经设置为512,是默认值的8倍。你知道吗

我使用的是TimescaleDB,这可能是由于锁的数量超过了正常数量(可能是每个块对应一个锁,而不是每个表对应一个锁),但这仍然不能解释在允许这么多锁的情况下会出现的问题。我假设这里发生的是所有查询都作为一个事务的一部分运行。你知道吗

我使用的代码如下所示。你知道吗

db = DatabaseConnector(**connection_params)
tables = db.get_table_list()
for table in tables:
     result = db.query(f"""SELECT a, b, COUNT(c) FROM {table} GROUP BY a, b""")
     print(result)

其中db.query定义为:

def query(self, sql):
    with self._connection.cursor() as cur:
        cur.execute(sql)
        return_value = cur.fetchall()
    return return_value

self._connection是:

self._connection = psycopg2.connect(**connection_params)

我是否需要以某种方式显式结束事务以释放锁?我怎样才能在psycopg2中这样做呢?我假设当光标在__exit__上关闭时,事务会隐式结束。我知道如果我插入或删除行,我会在末尾使用COMMIT,但是使用它似乎很奇怪,因为我没有更改表。你知道吗

更新:当我显式地打开和关闭循环中的连接时,不会显示错误。但是,我假设在每次选择之后有一种更好的方法来结束事务。你知道吗


Tags: selfdb数量returntableconnectionqueryselect