Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy(Postgresql)-竞争条件_Python_Postgresql_Web Applications_Sqlalchemy_Turbogears2 - Fatal编程技术网

Python SQLAlchemy(Postgresql)-竞争条件

Python SQLAlchemy(Postgresql)-竞争条件,python,postgresql,web-applications,sqlalchemy,turbogears2,Python,Postgresql,Web Applications,Sqlalchemy,Turbogears2,我们正在编写一个清单系统,我对sqlalchemy(postgresql)和事务/会话有一些疑问。这是一个使用TG2的web应用程序,不确定这是否重要,但对于很多信息来说,这从来都不是一个坏消息 如何确保在更改库存数量时,我不会遇到竞争条件。如果我理解正确的话,如果用户on要将某个项目的库存减少到0,并且用户2也试图将库存减少到0,那么如果用户1s会话尚未提交,那么用户2开始的库存编号将与用户1相同,从而在两个提交时都会导致竞争条件,一个覆盖另一个而不是具有复合效果 如果我想使用postgres

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

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

  • 如果我想使用postgresql序列来处理订单/发票号之类的事情,那么如何从sqlalchemy获取/设置下一个值而不遇到竞争条件

  • 编辑:我想我找到了需要与_lockmode一起使用的解决方案,用于更新或共享。如果我错了,我会留下更多的答案,或者让其他人来纠正我


    TIA

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

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

    编辑:


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

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

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

    编辑:


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

    设置您正在讨论的场景,并查看您的配置如何处理它。只需打开两个单独的连接即可进行测试


    还要阅读更新和事务隔离级别

    设置您正在讨论的场景,并查看您的配置如何处理它。只需打开两个单独的连接即可进行测试


    另外,请阅读更新和事务隔离级别

    以便了解库存中是否有5个项目。会话/交易1将减少2(售出其中的2个),会话/交易2将检查库存,查看有多少库存。如果事务2在事务1完成之前运行,事务2是否知道有3个在库,还是仍然看到5个在库?您要做的是查询一次以显示有多少项在库。两个用户都将看到5项库存,都要求3项。当他们向您发出请求时,您可以启动一个事务,请求项目数以确保您可以完成请求,然后尝试提交事务。如果这两个事务同时发生,则对项目数的所有查询都将返回5。在竞争条件中可能是错误的事务将失败。您可以通过重新启动事务处理该故障,然后发现没有足够的项目并让用户知道。如果这是不可接受的(为音乐会门票或类似的东西进行销售点)当用户询问X部分有多少部分时,您可以锁定X部分供其使用,或者在他们考虑使用该项时留出一些部分。“如果两个事务试图同时设置相同的值,其中一个将失败”——此行为取决于查询的隔离级别。使用postgresql的默认隔离级别(read committed),第二次更新将成功,不会出现错误,并且该行将包含不正确的值?其中tableid=?在默认(最快)隔离级别下是安全的。但我不认为SQLAlchemy可以生成这样的查询。所以如果有5个项目在库存中。会话/交易1将减少2(售出其中的2个),会话/交易2将检查库存,查看有多少库存。如果事务2在事务1完成之前运行,事务2是否知道有3个在库,还是仍然看到5个在库?您要做的是查询一次以显示有多少项在库。两个用户都将看到5项库存,都要求3项。当他们向您发出请求时,您可以启动一个事务,请求项目数以确保您可以完成请求,然后尝试提交事务。如果这两个事务同时发生,则对项目数的所有查询都将返回5。在竞争条件中可能是错误的事务将失败。您可以通过重新启动事务处理该故障,然后发现没有足够的项目并让用户知道。如果这是不可接受的(为音乐会门票或类似的东西进行销售点)当用户询问X部分有多少部分时,您可以锁定X部分供其使用,或者在他们考虑使用该项时留出一些部分。“如果两个事务试图同时设置相同的值,其中一个将失败”——此行为取决于查询的隔离级别。使用postgresql的默认隔离级别(read committed),第二次更新将成功,不会出现错误,并且该行将包含不正确的值?其中tableid=?在默认(最快)隔离级别下是安全的。但我认为SQLAlchemy无法生成这样的查询。