gpt4 book ai didi

ruby-on-rails - Rails 中非线程安全的示例

转载 作者:行者123 更新时间:2023-12-03 20:46:10 25 4
gpt4 key购买 nike

我见过类似 this 的帖子关于 Rails 中的线程安全以及有关该主题的各种网页,我相信每个人都擅长背诵它是什么,并就非线程安全的内容(“类变量!”)给出“提示”,但我可以似乎从来没有找到一个清晰、简单、完整的例子来说明在 Rails 中实际上不是线程安全的东西,以至于我想知道是否有人真正理解它。

如果有人能证明我是错的并给出:

  • 一个在 Rails 中不是线程安全的东西的清晰、简单、完整的例子。应该清楚代码在哪里(即,如果它在 Controller 中,请按原样显示)并且不应该让读者想象(例如不存在的方法)。此外,不应有任何多余的代码或逻辑。
  • 在两个用户同时在两个不同的线程上连接到网站的情况下,这到底是怎么回事。
  • 如何纠正问题。

  • 示例越重要且与 Rails 相关越好,因此,如果您能举出一个用户可能会看到另一个用户的数据(或类似数据)的示例,请这样做。

    最佳答案

    笔记
    这只是部分答案,因为它是一个陈旧的读取示例(可能由多进程和多线程引起),OP 只是在寻找多线程问题。

    假设您有一家商店向用户出售商品并相应地更新他的余额。

     PaymentsController

    if current_user.balance > item.price
    current_user.balance = current_user.balance - item.price #1
    current_user.create_purchase(item) #2
    current_user.save #3
    end

    这里的潜在问题是在条件内部(假设在第 1 行或第 2 行中)线程可以切换到不同的线程,完全运行,当我们返回到原始线程时,余额现在是不同的值(仍然卡住)在第 1 行)它不知道这已经发生了!它可能允许余额不足的用户进行购买,并且还会以错误的值覆盖实际余额。

    这是一个更具体的例子,说明这是如何发生的

    让我们假设用户试图通过购买超过其余额允许的数量来玩我们的系统。项目 1 花费 100,项目 2 花费 75,他的余额为 100。

    用户编写一个脚本来触发 2 个购买这些元素的帖子请求,以便它们几乎同时到达应用服务器。
    第一个请求命中第 1 行,就在第 2 行之前,线程切换到请求 2。
    第二个请求完全没有中断地运行 - 它购买第二个项目,因此新的实际余额现在是 25 (100 - 75)。现在上下文切换到请求 1。请求 1 没有意识到实际余额是 25(它仍然认为用户有足够的余额来购买元素:记住请求 1 在第 2 行,在条件内切换!请求 1完成购买,然后将余额更新为 0 (100 - 100)。用户刚刚购买了超过其余额应允许的两种产品!

    处理这种情况的一种方法是锁定 http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html

    关于ruby-on-rails - Rails 中非线程安全的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38587612/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com