防止我们的Rails应用程序中的重复数据库插入/更新来自同步事务

时间:2012-01-04 13:17:03

标签: mysql ruby-on-rails ruby transactions scalability

由于我们的Rails应用程序处理增加的用户活动和负载,我们开始看到同时交易的一些问题。我们在点击后使用JavaScript来禁用/删除按钮,这在很大程度上起作用,但不是理想的解决方案。简而言之,用户正在快速连续多次执行操作。因为操作导致在DB中插入行,所以我们不能只锁定表中的一行。鉴于受影响模型的活动水平很高,我无法使用您用于更新的常用锁定机制(http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update)。

这个问题(Prevent simultaneous transactions in a web application)解决了类似的问题,但它使用文件锁定(flock)来提供解决方案,因此这对于多个应用程序服务器不起作用,就像我们一样。我们可以使用Redis或其他可用于所有应用程序服务器的数据存储来做类似的事情,但我不知道这是否真的可以完全解决问题。

防止重复数据库插入同时执行的事务的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

尝试向遇到问题的表添加唯一索引。它不会阻止系统尝试插入重复数据,但会阻止它存储在数据库中。您只需要在失败时处理插入。