使用事务进行唯一性验证

时间:2017-07-13 06:50:23

标签: ruby-on-rails activerecord

我使用交易来保存酒店模型。这是一个代码:

def init
  Hotel.transaction do
    @hotel.save!
    create_related_models
  end
end

我在酒店的:name进行了唯一性验证。验证在交易中不起作用。在事务中实现数据库相关验证的方法是什么?

解释为什么验证不起作用。

当用户提交表单时,请求大约需要10秒。如果他在请求期间点击另一次(在保存按钮上),那么他将保存两个具有相同名称的酒店(这是问题)。这是因为当另一个交易开始时,第一笔交易没有完成。所以当另一个开始时,数据库中没有酒店,所以验证返回true

1 个答案:

答案 0 :(得分:1)

您需要:

  1. 添加数据库约束以防止此行为,并捕获并处理任何错误。应用程序无法查看未提交的RDBMS事务。只有数据库可以做到这一点。
  2. 在应用程序中添加一个锁定机制,如果你在多个线程(Heroku dynos?)上运行将会很困难。
  3. 大大减少了交易所需的时间。
  4. 在交易之外移动相关模型的创建,并提供手动删除酒店记录的机制,这是执行期间出现的问题。
  5. 删除唯一性验证。