ruby-on-rails - 在 Rails 中,数据库锁定是否会确保只有进程一次检查属性值而不会成为巨大的瓶颈?

标签 ruby-on-rails postgresql activerecord

我们的设置是 Rails 3,在一个负载均衡器和一个 PostgreSQL 数据库后面有 6 个应用服务器。

在我们的应用程序中,用户可以在表演期间“给小费”和艺术家。

流程如下所示:

  1. 用户点击“提示”按钮
  2. 提示对象已创建
  3. after_create 回调确保用户帐户有足够的钱,如果是的话,金融交易会转移钱。否则,将引发回滚异常。

可能发生的情况是,如果用户“发送垃圾邮件”提示按钮,则可以同时处理多个提示。当这种情况发生时,“这个用户有足够的钱吗?”由于财务交易尚未发生,因此检查会为许多提示返回相同的值。

我需要的是确保每个“提示”都按顺序得到处理。这样,tip #2 的余额检查确实发生在 tip #1 更新余额之前。

我们已经将 Resque 用于其他用途,因此这可能是一种解决方案。尽管我不知道有什么方法可以确保多个作品不会同时开始处理作业并导致同样的问题。让一名员工做小费工作不是可行的解决方案,因为我们的应用程序在任何特定时刻都会处理大量小费。

最佳答案

如果您在数据库事务中强制执行此操作,这是一个相当容易解决的问题。

http://www.postgresql.org/docs/9.1/interactive/mvcc.html

关于ruby-on-rails - 在 Rails 中,数据库锁定是否会确保只有进程一次检查属性值而不会成为巨大的瓶颈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10178767/

相关文章:

sql - 获取 GROUP BY 后的行数

mysql - Postgres 从序列中提取多个 future 的键

sql - Rails 多对多存在查询

sql - 如何使用 Active Record 查找包含重复数据的记录

ruby-on-rails - 按当天的 Active Record 顺序

mysql - Rails - 在文本列中插入超过 7786 个字符时获取 'Mysql server has gone away'

ruby-on-rails - 无方法错误 : undefined method `email' for nil:NilClass : can't send email with devise/sendgrid(Rails 3. 2)

ruby-on-rails - 为什么列 trades.item_id 不存在?

ruby-on-rails - 获取 Rails 错误 "Cannot allocate memory"

django - 如何知道 Django 中的数据库何时准备就绪?