Rails数据库结果不一致

时间:2018-12-05 20:37:15

标签: ruby-on-rails activerecord rails-activerecord

我有一个Rails应用程序,其中有一个在表上创建元素的请求,另一个正在等待,它读取是否创建了该元素。

现在,我检查了实时数据,并且等待过程从未看到该表的任何新记录。

有什么主意如何强制重新连接或会更新模型参考的任何内容?

基本思想:

  • 一个用户通过POST创建一条记录(我可以直接在数据库上看到它)。
  • 在请求之前运行的另一段代码正在等待该记录,但找不到该记录。

我将不胜感激。

2 个答案:

答案 0 :(得分:1)

等待的请求可能正在使用ActiveRecord缓存。 Rails在请求持续时间内缓存查询,因此,如果您在同一请求中多次运行完全相同的查询,则只会在第一次访问数据库。

您可以在控制台中对此进行仿真:

Entity.cache { Entity.first; Entity.first }

在日志中,您会看到类似以下内容(请注意,第二个请求是CACHE):

[2018-12-06T10:51:02.436 DEBUG (1476) #] Entity Load (4.9ms)  SELECT "entities".* FROM "entities" LIMIT 1
[2018-12-06T10:51:02.450 DEBUG (1476) #] CACHE (0.0ms)  SELECT "entities".* FROM "entities" LIMIT 1

要绕过缓存,可以使用:

Entity.uncached { Entity.where(key: @key)&.last }

即使封闭范围在uncached块内运行,使用cached也会禁用块内的缓存。

答案 1 :(得分:0)

对于一个正在运行的Rails应用程序来说,如果正在运行的一段代码正在寻找由新请求更新的任何内容,则在第一次执行该代码之后,将不会使用active_record模型显示更新的数据。

解决方案:只需运行原始查询即可。

sql = "SELECT * FROM entities WHERE key = '"+key+"' ORDER BY ID DESC LIMIT 1;" records_array = ActiveRecord::Base.connection.execute(sql).values

我知道这是一个极大的过分简化,可能存在一个潜在的问题,但是确实解决了。