python-3.x - 对于更新 - 用于 postgres 的 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()
请帮助我们澄清语法并解释该语法是否正确,然后该查询如何锁定第一个线程的获取记录。
谢谢,桑杰。
解决方案
如果执行此示例查询
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
使用此子句,第二个事务将跳过锁定的行并返回接下来的两次而无需等待。
在文档中阅读它。
推荐阅读
- python - Python Networkx with_pandas_edgelist:边缘没有采用正确的颜色,同时指定节点位置
- c# - 从 C# 中的代码访问用户控件属性和值
- python - 如何从 Compute Engine 中的 2.7 升级到 Linux centos 中的 Python 3.7?
- google-docs - 如何复制谷歌文档并共享对电子邮件的访问权限?
- ssl-certificate - 在 MQ 密钥库中交换 SSL 证书
- azure-blob-storage - Azure 数据工厂复制管道未将数据复制到接收器
- java - 自定义异常类中的非静态字段返回 null 或 0
- reactjs - 基于路由的条件渲染
- python - 如何将具有相同值的键合并到一个对象中?
- azure - 逻辑应用错误 FTP 服务器 xxx.xxx.xxx 当前不可用