我对数据库比较陌生。我相信这是经验能回答的问题。
我在postgresql中使用sqlalchemy。我建立了一个系统,在这个系统中,分布在多台计算机上的多个进程执行各种任务,然后更新数据库我在测试中还没有遇到任何事务冲突,但理论上它们仍然是可能的。
从我在Google上找到的信息来看,我要么需要获得数据库的锁,要么准备重新启动事务不幸的是,关于如何真正做到这一点的信息很少。
我假设,要重新启动事务,SQLAlchemy抛出了一些异常,我的代码必须捕获这些异常,并自行执行重试如果我违反了唯一性约束,表明代码中存在错误,而不是事务冲突,那么这个异常与sqla抛出的异常有区别吗?我用数据库锁会更好吗?
提前谢谢!
--编辑--
我刚刚知道“ConcurrentModificationError”这个名字听起来确实像是我要找的。The documentation说它是StaleDataError的别名,它的名字听起来同样正确,但它的文档相当不透明这就是我要找的错误吗?
再次感谢!

最佳答案

我从未见过这个错误,尽管StaleModificationError的详细信息表明这可能是您所关心的问题,但不需要锁定整个数据库。您可以在transaction isolation in Postgres上阅读,以防止不同的进程工作器在不知不觉中读取另一个事务中正在更新的行。
如果您将隔离级别设置得更高(read committed等),那么您的SA会话将开始收集它所接触的不同行上的锁您可以根据您的设计决定设置隔离级别的严格程度。您可以使它足够严格,当您的读者试图读取另一个事务已锁定的行时,他们将抛出异常,然后您可以选择回滚或使用refresh/expire interface更新该特定会话。

09-30 15:38
查看更多