对于更新-对于psycopg2游标,用于postgres

时间:2018-09-17 15:39:26

标签: python-3.x multithreading cursor psycopg2

我们正在使用psycopg2 jsonb游标来获取数据和处理,但是一旦有新线程或新处理出现,它就不应获取并处理与第一个处理或线程相同的记录。

为此,我们尝试使用FOR UPDATE,但我们只想知道我们是否使用正确的语法。

    con = self.dbPool.getconn()
    cur = conn.cursor()             
    sql="""SELECT jsondoc FROM %s WHERE jsondoc @> %s"”"             
    if 'sql' in queryFilter:                 
   sql += queryFilter 'sql’]   
   When we print this query, it will be shown as below:             
         Query: "SELECT jsondoc FROM %s WHERE jsondoc @> %s AND (jsondoc ->> ‘claimDate')::float <= 1536613219.0 AND ( jsondoc ->> ‘claimstatus' = ‘done' OR jsondoc ->> 'claimstatus' =                    'failed' ) limit 2 FOR UPDATE"         
 cur.execute(sql, (AsIs(self.tablename), Json(queryFilter),)) 
    cur.execute()
    dbResult = cur.fetchall()

请帮助我们阐明语法并解释该语法是否正确,然后此查询如何锁定获取的第一个线程记录。

谢谢, 桑杰。

1 个答案:

答案 0 :(得分:0)

如果执行此示例查询

select * 
from my_table
order by id
limit 2
for update; -- wrong

然后锁定两个结果行,直到事务结束(即下一个connection.rollback()connection.commit()或连接关闭)为止。如果在此期间另一个事务尝试运行相同的查询,它将停止直到两行解锁。因此,不是您期望的行为。您应该添加skip locked子句:

select * 
from my_table
order by id
limit 2
for update skip locked; -- correct

使用此子句,第二个事务将跳过锁定的行,并在不等待的情况下返回下一次两次。

the documentation.

中进行了解