postgres& psycopg服务器端游标:数据会被锁定吗?

时间:2017-11-15 20:24:51

标签: sql database postgresql cursor psycopg2

我想使用psycopg为我的postgres DB创建一个服务器端游标,这样我就可以读取一个非常大的表

cursor = conn.cursor('name_of_the_new_server_side_cursor')
cursor.execute(""" SELECT * FROM table LIMIT 10000000 """)

while True:
    rows = cursor.fetchmany(5000)
    if not rows:
        break

    for row in rows:
        # do something with row
        pass

当我遍历大表,提取数据时,在查询运行时,行可以更新或由其他进程/查询添加吗?如果是这样,当我的光标遍历表时,它会看到更新/新数据或数据,就像最初执行查询时一样吗?例如,当我拉出前50k行数据时,会对行51201进行更新。当我的光标向下移动以将数据从行50,000拉到55000时,我的查询将以更新的形式或原始形式返回行?如果另一个进程添加了一个新行,我的查询会在第一次运行cursor.execute语句时返回新行还是返回其状态表?

1 个答案:

答案 0 :(得分:0)

The Documentation regarding autocommit says:

  

默认情况下,任何查询执行,包括一个简单的SELECT都将启动一个事务:对于长时间运行的程序,如果不采取进一步的操作,会话将保持“在事务中空闲”,这是一个不合适的条件,原因有几个(锁定会议持有,表格膨胀......)。

因此,选择将与每个其他事务具有相同的锁。

如果您只是想拉读数据,可以尝试通过设置来修复它:

conn.set_session(readonly=True, autocommit=True)

但是,如果您希望处理/更新数据,最好在数据库中的存储过程中执行此操作,具体取决于您要查找的内容。