【问题标题】:Data concurrency because doctrine use SET column_name = value instead of increment it like SET column_name = column_name + difference_value数据并发,因为学说使用 SET column_name = value 而不是像 SET column_name = column_name + difference_value 那样递增它
【发布时间】:2015-10-13 06:19:25
【问题描述】:

我在 symfony2 中使用了学说 2。我有关于数据并发的问题。这是我的情况。

我创建了一个电子商务网站。假设我有数量 = 5 的产品 A。客户 X 购买了 4 件产品 A,客户 Y 同时购买了 2 件产品 A。 对于客户 X 案例,doctrine 会查询产品 A,初始数量为 5。然后,doctrine 更新数量并将其设置为 1 (5 - 4)。 对于客户 Y 的情况,产品 A 的初始数量仍然是 5,因为客户 Y 和客户 X 同时购买了该产品,因此他们得到相同的初始数量。然后学说将数量更新为 3 (5 - 2)。

如果教义 2 提供了某种方法来生成查询,如 SET column_name = column_name + difference_value 而不是 SET column_name = value,这将是一个不错的解决方案。但据我所知,doctrine2 总是使用 SET column_name = value 生成查询。

是否有任何解决方案或解决方法,而不是锁定表?通过锁定表,这意味着客户 Y 必须等到客户 X 完成交易。假设有 100 个客户同时购买该产品,性能会很差。

谢谢。

【问题讨论】:

    标签: symfony concurrency doctrine-orm


    【解决方案1】:

    【讨论】:

    • 是的,我也在为这种情况使用事务。但是因为他们同时购买了相同的产品,所以他们获得了相同的初始数量,而不是最新的更新数量。
    • 乐观锁怎么样?如果发生异常,请从数据库重新加载产品并再次尝试更新数据。
    • 是的,我认为它可以解决我的问题。但我仍然想知道对性能的影响如何。例如,如果 10 或 20 个客户同时购买相同的产品,那么它必须一次又一次地重新加载产品。非常感谢您的解决方案。
    • 也许您应该将操作推送到某种消息队列?喜欢rabbitmq?如果你不能 - 只是扩大你的堆栈并保持冷静或找到解决方法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多