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

Posted

技术标签:

【中文标题】防止我们的 Rails 应用程序中的重复数据库插入/更新同时发生事务【英文标题】:Preventing duplicate database inserts/updates in our Rails app from simultaneous transactions 【发布时间】:2012-02-02 09:27:16 【问题描述】:

随着我们的 Rails 应用程序处理不断增加的用户活动和负载,我们开始看到并发事务的一些问题。我们使用 javascript 在单击后禁用/删除按钮,这在大多数情况下都有效,但不是理想的解决方案。简而言之,用户正在快速连续地多次执行一个动作。因为该操作导致向数据库中插入一行,所以我们不能只锁定表中的一行。鉴于受影响模型上的大量活动,我无法使用您将用于更新的常用锁定机制 (http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update)。

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢 - 我正在测试表上的多键唯一约束,这是一个很好的建议,当然应该防止插入。只是好奇是否有任何其他关于如何防止这种情况的建议。感谢您的回复。

以上是关于防止我们的 Rails 应用程序中的重复数据库插入/更新同时发生事务的主要内容,如果未能解决你的问题,请参考以下文章

防止 SQL 表中的重复值

MySQL防止重复插入相同记录

MySQL防止重复插入唯一限制的数据 4种方法

MySQL防止重复插入唯一限制的数据 4种方法

MySQL防止重复插入唯一限制的数据 4种方法

如何防止将重复数据插入到值为多个的 SQL Server 表中