0

在 Rails 中(对于表)似乎没有内置的方法来获取读锁。我知道这些通常并不理想,但我的用例似乎需要一个:

分配中可用的票数有限,我希望对整个事务有一个读锁,如下所示:

  1. 检查是否还有足够的票
  2. 将它们全部分配给此事务(通过在票证表中创建行)

如果两个请求同时执行第一步,可能会创建太多票证对象,因为可用票证的数量同时发生了变化(竞争条件)

是否有另一种方法可以更好地遵循 Rails 的心态,或者我是否根据需要坚持手动锁定和解锁?

(理想情况下,解决方案与数据库无关)

谢谢!

4

2 回答 2

0

我同意你关于必须在你的用例中同步访问数据库的观点。除了使用锁之外,您还可以使用队列序列化数据库操作:在某个时间点只有一个操作可以访问您的数据库 - 我认为这是管理对资源的并发访问的更高级模型。锁对死锁很敏感,我会不惜一切代价避免这些。

另一种可以解决您的问题的但依赖于数据库的策略将使用“可序列化”的事务隔离级别。

于 2013-11-10T22:31:16.853 回答
0

坦率地说,我不记得 active_record 管理数据库级锁。整个“rails-way”范式部分违背了许多古老的 dba 习语(以 STI 为例)。所以,是的,你被手动锁定卡住了。不过,您可以使用一些互斥类(或其他任何东西)来实现它。

第二种选择是重新考虑您的解决方案。您可以使用某种封顶集合/队列很好地管理。

于 2013-11-10T23:45:29.363 回答