如何在Rails中的两个表中validation唯一性时避免竞争条件

这个问题讨论了validation两个表的唯一性,并且接受的答案提到“这样的代码级别唯一约束可能在并行请求之间的竞争条件下不起作用,除非这可以在数据库级别完成。”

也就是说,如果你有一个User和一个Organization并且要在两者之间validation一个独特的slug ,你如何在数据库级别确保这一点,或者避免出现竞争条件的可能性?

我唯一的想法是创建一个像Slug这样的相关记录, belongs_to两个模型。 您可以在还创建关联记录的事务中包装这些模型的createupdate 。 除非确保存在额外的唯一性约束,否则此记录不会用于任何事情,如果违反此规则,则会在数据库级别引发错误。

有没有更好的方法,还是我走在正确的道路上?

我会使用类似的东西,但添加数据库约束以确保这些slu的“唯一性”。 所以,总结一下:

  • 多态模型Slugbelongs_to :sluggable, polymorphic: true
  • 用于控制关联模型的创建(或回滚)的事务
  • DB层的约束以确保唯一性: add_index :slugs, :slug, unique: true