Ruby on rails 事务的唯一性验证

Ruby on rails 事务的唯一性验证,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我使用事务来保存酒店模型。下面是一个代码: def init Hotel.transaction do @hotel.save! create_related_models end end 我在酒店的:name上进行了唯一性验证。验证不是事务内部的工作。在事务中实现数据库相关验证的方法是什么 解释为什么验证不起作用 当用户提交表单时,请求大约需要10秒。如果他在请求期间单击另一时间(保存按钮),则他将保存两个同名酒店(这是问题)。这是因为当另一个事务开始时,第一个事务没

我使用事务来保存酒店模型。下面是一个代码:

def init
  Hotel.transaction do
    @hotel.save!
    create_related_models
  end
end
我在酒店的
:name
上进行了唯一性验证。验证不是事务内部的工作。在事务中实现数据库相关验证的方法是什么

解释为什么验证不起作用


当用户提交表单时,请求大约需要10秒。如果他在请求期间单击另一时间(保存按钮),则他将保存两个同名酒店(这是问题)。这是因为当另一个事务开始时,第一个事务没有完成。因此,当另一次启动时,数据库中没有酒店,因此验证返回true,您需要:

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

  • 我想添加锁定机制,但结果太难了。感谢所有的解决方案。目前我添加了javascript按钮块,但我也将实现您的第一个解决方案(约束和处理错误)