我们正在编写一个清单系统,我有一些关于sqlalchemy(postgresql)和事务/会话的问题。这是一个使用TG2的web应用程序,不确定这是否重要,但对于很多信息来说,这从来都不是坏事。
如何才能确保在改变库存数量时,我不会遇到竞争条件。如果我正确地理解了,如果用户on打算将某个项目的库存减少到0,而用户2也试图将库存减少到0,那么如果用户1s会话尚未提交,那么用户2的起始库存编号将与用户1相同,从而导致两个提交时的竞争条件,一个覆盖另一个而不是有复合效果。
如果我想将postgresql序列用于订单号/发票号之类的事情,那么如何从sqlalchemy中获取/设置下一个值而不遇到竞争条件?
编辑:我想我找到了解决方案,我需要与锁模式一起使用,用于更新或共享。如果我错了,我会留下更多的答案或者让其他人来纠正我。
短暂性脑缺血发作
最佳答案
如果两个事务试图同时设置相同的值,其中一个将失败。失利者需要错误处理。对于您的特定示例,您将需要查询零件数量并更新同一事务中的零件数量。
序列号上没有竞争条件。保存一条使用序列号的记录,数据库将自动为其分配序列号。
编辑:
注意,正如Limscoder指出的,您需要将隔离级别设置为可重复读取。