首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于更新-用于postgres的psycopg2游标

用于更新-用于postgres的psycopg2游标
EN

Stack Overflow用户
提问于 2018-09-17 23:39:26
回答 1查看 373关注 0票数 0

我们使用psycopg2 jsonb游标来获取数据并进行处理,但是当出现新的线程或处理时,它不应该获取和处理第一个进程或线程的相同记录。

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

代码语言:javascript
复制
    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()

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

谢谢,桑杰。

EN

回答 1

Stack Overflow用户

发布于 2018-09-18 00:11:40

如果执行该示例性查询

代码语言:javascript
复制
select * 
from my_table
order by id
limit 2
for update; -- wrong

然后锁定两个结果行,直到事务结束(即next connection.rollback()connection.commit()或连接关闭)。如果另一个事务在这段时间内尝试运行相同的查询,它将停止,直到两行解锁。所以it is not the behaviour你是期望的。您应该添加skip locked子句:

代码语言:javascript
复制
select * 
from my_table
order by id
limit 2
for update skip locked; -- correct

有了这个子句,第二个事务将跳过锁定的行并返回下两个onces,而无需等待。

请在the documentation.上阅读相关信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52371376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档