gpt4 book ai didi

python - 正确使用 psycopg2 序列化

转载 作者:太空狗 更新时间:2023-10-30 02:59:22 30 4
gpt4 key购买 nike

我正在访问带有序列化事务隔离的 postgresql 表。我正在做这样的事情(使用现有的 psycopg2 连接 conn 和该连接中的光标,cur:

while True:
try:
cur.execute(query)
break
except TransactionRollbackError:
[sleep a little]
continue
except Exception:
[handle error here]

这样做的目的是在出现序列化争用时重试。现在,这在很多时候都很好用。但是在 TransactionRollbackError 陷阱中进行了一次迭代后,我经常会收到此错误:

当前事务被中止,命令被忽略,直到事务 block 结束。显然,以这种方式旋转以避免序列化争用是不合适的?我应该换一种方式吗?

一些注意事项:我正在使用不同的进程访问表(它们都是相同的并且做同样的事情:选择、递增和更新/插入到表中。)这些进程中的每一个都有自己的连接 conn,它们没有共享连接。

另一个注意事项:似乎在经历了一次 TransactionRollbackError 异常 block 之后,在 while 循环的下一次旋转中它最终进入了 Exception 异常 block 。

还有一个注意事项:同时运行的进程数对错误频率有直接影响,因为更多的进程往往会产生更多的错误。因此,存在某种争论。我的印象是使用带有重试的序列化事务隔离(如在我的演示代码中)可以解决这个问题。

最佳答案

您应该执行 rollbackexcept TransactionError: 分支中从错误状态中恢复:

while True:
try:
cur.execute(query)
break
except TransactionRollbackError:
conn.rollback()
[sleep a little]
continue
except Exception:
[handle error here]

这是 recommendation made the FAQ as well .

请注意,它将回滚到目前为止的所有 SQL 命令,除非您一直在执行自己的事务控制或在自动提交 模式下建立连接。

关于python - 正确使用 psycopg2 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31764617/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com