hor*_*air 5 python postgresql psycopg
我正在访问带有序列化事务隔离的 postgresql 表。我正在做这样的事情(使用现有的 psycopg2 连接conn和该连接中的光标,cur:
while True:
try:
cur.execute(query)
break
except TransactionRollbackError:
[sleep a little]
continue
except Exception:
[handle error here]
Run Code Online (Sandbox Code Playgroud)
这样做的目的是在序列化争用的情况下重试。现在,这在大部分时间都可以正常工作。但我经常在TransactionRollbackError陷阱中进行一次迭代后收到此错误:
current transaction is aborted, commands ignored until end of transaction block. 显然,以这种方式旋转以避免序列化争用是不合适的?我应该以不同的方式做这件事吗?
一些注意事项:我正在使用不同的进程访问表(它们都是相同的并且做同样的事情:选择、增加和更新/插入到表中。)这些进程中的每一个都有自己的连接conn,它们不共享一个联系。
另一个注意事项:似乎在通过TransactionRollbackError异常块一次之后,在 while 循环的下一次旋转中,它最终在Exception异常块中结束。
还有一个注意事项:同时运行的进程数对错误的频率有直接影响,因为更多的进程往往会产生更多的错误。因此,存在某种争论。我的印象是使用带重试的序列化事务隔离(如在我的演示代码中)可以解决这个问题。
您应该rollback在except TransactionError:分支中执行 a以从错误状态中恢复:
while True:
try:
cur.execute(query)
break
except TransactionRollbackError:
conn.rollback()
[sleep a little]
continue
except Exception:
[handle error here]
Run Code Online (Sandbox Code Playgroud)
请注意,它会回滚到目前为止的所有SQL 命令,除非您一直在进行自己的事务控制或连接处于autocommit模式下。
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |