2

我们正在编写一个库存系统,我对 sqlalchemy (postgresql) 和事务/会话有一些疑问。这是一个使用 TG2 的网络应用程序,不确定这是否重要,但对于很多信息来说从来都不是坏事。

  1. 如何确保在更改库存数量时我不会遇到竞争条件。如果我理解正确,如果用户将减少某个项目的库存以说 0 并且用户 2 也试图将库存减少到 0,那么如果用户 1 的会话尚未提交,那么用户 2 的起始库存编号将会与用户相同,当两者都提交时导致竞争条件,一个覆盖另一个而不是产生复合效果。

  2. 如果我想将 postgresql 序列用于订单/发票编号等内容,我如何从 sqlalchemy 获取/设置下一个值而不会遇到竞争条件?

编辑:我想我找到了我需要使用 with_lockmode 的解决方案,用于更新或共享。如果我弄错了,我将保留更多答案或让其他人纠正我。

TIA

4

2 回答 2

3

如果两个事务尝试同时设置相同的值,其中一个将失败。丢失的将需要错误处理。对于您的特定示例,您将需要查询零件数量并更新同一事务中的零件数量。

序列号没有竞争条件。保存使用数据库将自动分配的序列号的记录。

编辑:

请注意,Limscoder 指出您需要将隔离级别设置为可重复读取。

于 2012-06-14T13:31:54.010 回答
1

设置您正在谈论的场景并查看您的配置如何处理它。只需打开两个单独的连接来测试它。

还阅读了 FOR UPDATE For Update以及事务隔离级别Isolation Level

于 2012-06-14T16:09:12.857 回答