我们的设置是 Rails 3,在一个负载均衡器和一个 PostgreSQL 数据库后面有 6 个应用服务器。
在我们的应用程序中,用户可以在表演期间“给小费”和艺术家。
流程如下所示:
- 用户点击“提示”按钮
- 提示对象已创建
- after_create 回调确保用户帐户有足够的钱,如果是的话,金融交易会转移钱。否则,将引发回滚异常。
可能发生的情况是,如果用户“发送垃圾邮件”提示按钮,则可以同时处理多个提示。当这种情况发生时,“这个用户有足够的钱吗?”由于财务交易尚未发生,因此检查会为许多提示返回相同的值。
我需要的是确保每个“提示”都按顺序得到处理。这样,tip #2 的余额检查确实发生在 tip #1 更新余额之前。
我们已经将 Resque 用于其他用途,因此这可能是一种解决方案。尽管我不知道有什么方法可以确保多个作品不会同时开始处理作业并导致同样的问题。让一名员工做小费工作不是可行的解决方案,因为我们的应用程序在任何特定时刻都会处理大量小费。
最佳答案
如果您在数据库事务中强制执行此操作,这是一个相当容易解决的问题。
关于ruby-on-rails - 在 Rails 中,数据库锁定是否会确保只有进程一次检查属性值而不会成为巨大的瓶颈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10178767/