我目前正在开发rails API。我需要能够从表中锁定单个行,以便在更新之前不能读取。我必须这样做,所以程序不会检索当前用于进行某些计算的信息,从而产生不正确的结果。
据我所知,ActiveRecord提供了使用Postgres或MySQL实现 lock 的方法。甚至还有一种方法可以锁定整个表进行阅读,但是我无法找到任何关于阻止单个行可读性的内容。
有人建议我在我的模型中添加一个标志,所以从访问它的那一刻起,它立即将记录的列更新为in_use = true
。当运行检索特定Model的实例的下一个查询时,它必须检查该标志是否为false。我唯一担心的是,在提交记录之前有一个非常小的时间窗口可能会导致读取正在使用的行。还有其他建议吗?
答案 0 :(得分:1)
PostgreSQL没有提供一种方法来锁定所有读取行。
您可以使用SELECT ... FOR SHARE
或SELECT ... FOR UPDATE
的查询锁定行,而不是针对普通SELECT
的查询。
如果您控制读取网站,您可以像Doon建议的那样在行被锁定时使用SELECT ... FOR SHARE
来阻止您想要阻止的阅读器,并SELECT ... FOR UPDATE
来锁定该行。