2012-01-04 45 views
2

由于我们的Rails应用程序处理不断增加的用户活动和负载,我们开始看到一些与同时事务有关的问题。我们使用JavaScript在点击后禁用/删除按钮,这在大多数情况下都可行,但不是理想的解决方案。简而言之,用户正在快速连续多次执行操作。由于该行为导致行插入到数据库中,因此我们不能只锁定表中的一行。鉴于受影响型号的高级别活动,我无法使用用于更新的常用锁定机制(http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update)。防止在同步事务中在我们的Rails应用程序中重复插入数据库/更新

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

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

回答

4

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

+0

谢谢 - 我在桌上测试一个多键唯一约束,这是一个很好的建议,当然应该防止插入。只是好奇,如果有任何其他建议如何防止这种情况。我很欣赏这种回应。 – shedd 2012-01-05 22:02:13

相关问题