Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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
Ruby on rails 如何在Rails中使ActiveRecord更新线程安全?_Ruby On Rails_Ruby_Multithreading_Activerecord_Resque - Fatal编程技术网

Ruby on rails 如何在Rails中使ActiveRecord更新线程安全?

Ruby on rails 如何在Rails中使ActiveRecord更新线程安全?,ruby-on-rails,ruby,multithreading,activerecord,resque,Ruby On Rails,Ruby,Multithreading,Activerecord,Resque,我有一个重新排队的工作。每个作业都有一批要处理的事件。工人将处理作业,并计算每分钟发生的事件数。它使用ActiveRecord获取该分钟的数据点,并向其中添加事件数并保存 当我有多个工作人员处理该队列时,我认为存在并发问题。我认为在从数据库获取数据点、添加正确的数据量和更新到新值之间存在竞争条件。我研究了事务,但我认为只有当查询失败时,这才有帮助 我当前的解决方法仅使用1个重新确认工作人员。不过,我想更快地扩展和处理作业。有什么想法吗 编辑:我最初在谷歌搜索关键词时遇到困难,但多亏了罗宾,我找到

我有一个重新排队的工作。每个作业都有一批要处理的事件。工人将处理作业,并计算每分钟发生的事件数。它使用ActiveRecord获取该分钟的数据点,并向其中添加事件数并保存

当我有多个工作人员处理该队列时,我认为存在并发问题。我认为在从数据库获取数据点、添加正确的数据量和更新到新值之间存在竞争条件。我研究了事务,但我认为只有当查询失败时,这才有帮助

我当前的解决方法仅使用1个重新确认工作人员。不过,我想更快地扩展和处理作业。有什么想法吗

编辑:我最初在谷歌搜索关键词时遇到困难,但多亏了罗宾,我找到了问题的答案


正确答案是,如果需要增加多个属性或+1以外的值,请使用增量计数器或更新计数器。这两个类都是模型类。

如果线程安全唯一需要的是增量,那么可以使用增量方法吗?这意味着您不需要当前的数据点。我认为,在mysql中,像updateevents SET count=count+42这样的操作是线程安全的。谢谢。我找到了。增量方法不是线程安全的。不需要自定义SQL代码,因为update_计数器生成的SQL基本相同。是的,对不起,我不是想在那里使用原始SQL。我刚刚在某个地方读到mysql在执行此操作时锁定了表,所以我认为它是线程安全的。