结束SELECT事务psycopg2和postgres

时间:2019-06-20 14:26:10

标签: python postgresql psycopg2

我正在使用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,但是使用起来似乎很奇怪,因为我没有更改表。

更新:当我在循环中显式打开和关闭连接时,未显示错误。但是,我认为有一个比这更好的方法来结束每个SELECT之后的事务。

0 个答案:

没有答案