python – 处理与SQLAlchemy的事务冲突

我对数据库比较陌生.我确信这是经验可以回答的那种问题.

我正在使用SQLAlchemy和PostgreSQL.我有一个系统设置,其中多个进程分布在几台计算机上执行各种任务,然后更新数据库.我在测试中还没有遇到任何交易冲突,但理论上它们仍然可行.

根据我在Google上找到的信息,看起来我要么必须获取数据库锁,要么准备重启事务.不幸的是,关于如何实际执行此操作的信息很少.

我假设,为了重新启动事务,SQLAlchemy抛出了一些异常,我的代码必须捕获并执行重试.如果我违反唯一性约束,指示我的代码中的错误而不是事务冲突,那么该异常是否与SQLA抛出的异常不同?我会更好地使用数据库锁吗?

提前致谢!

– 编辑 –

我刚学会了“ConcurrentModificationError”.名字肯定听起来像我正在寻找的例外. The documentation说它是StaleDataError的别名,它的名字听起来也是正确的,但其文档非常不透明.这是我正在寻找的错误吗?

再次,非常感谢!

最佳答案 我没见过这个错误,虽然StaleModificationError的详细信息表明它可能是你关心的事情,但是不需要锁定整个数据库.您可能会在
transaction isolation in Postgres上阅读,以防止不同的流程工作者在另一个事务中无意中读取正在更新的行.

如果您将隔离级别设置得更高(读取已提交等),那么SA会话将开始收集它正在触摸的各个行上的锁定.您决定设计的隔离级别是多么严格.你可以使它足够严格当你的读者尝试读取另一个事务已锁定的行时会抛出异常,然后你可以选择回滚或使用refresh/expire interface更新该特定会话.

点赞