Rails 数据库结果不一致
Rails Inconsistent database results
我有一个 Rails 应用程序,其中有一个在 table 上创建元素的请求,另一个正在等待,读取是否创建了此类元素。
现在,我检查实时数据,等待过程从未看到 table 的任何新记录。
关于如何强制重新连接或任何更新模型引用的想法?
基本思路:
- 一个用户通过 POST 创建一条记录(我可以直接在数据库中看到)。
- 在请求之前 运行 的另一段代码正在等待该记录,但没有找到它。
如果有任何见解,我将不胜感激。
看起来,对于 运行ning Rails 应用程序,如果 运行ning 一段代码正在寻找已被新请求更新的任何内容,则在第一次开始执行,更新的数据不会显示,使用 active_record 模型。
解决方案:只是 运行 原始查询。
sql = "SELECT * FROM entities WHERE key = '"+key+"' ORDER BY ID DESC LIMIT 1;"
records_array = ActiveRecord::Base.connection.execute(sql).values
我知道这是一个巨大的过度简化,可能存在潜在的问题,但它确实解决了它。
等待的请求可能正在使用 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
将禁用块内的缓存,即使封闭范围 运行ning 在 cached
块内也是如此。
我有一个 Rails 应用程序,其中有一个在 table 上创建元素的请求,另一个正在等待,读取是否创建了此类元素。
现在,我检查实时数据,等待过程从未看到 table 的任何新记录。
关于如何强制重新连接或任何更新模型引用的想法?
基本思路:
- 一个用户通过 POST 创建一条记录(我可以直接在数据库中看到)。
- 在请求之前 运行 的另一段代码正在等待该记录,但没有找到它。
如果有任何见解,我将不胜感激。
看起来,对于 运行ning Rails 应用程序,如果 运行ning 一段代码正在寻找已被新请求更新的任何内容,则在第一次开始执行,更新的数据不会显示,使用 active_record 模型。
解决方案:只是 运行 原始查询。
sql = "SELECT * FROM entities WHERE key = '"+key+"' ORDER BY ID DESC LIMIT 1;"
records_array = ActiveRecord::Base.connection.execute(sql).values
我知道这是一个巨大的过度简化,可能存在潜在的问题,但它确实解决了它。
等待的请求可能正在使用 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
将禁用块内的缓存,即使封闭范围 运行ning 在 cached
块内也是如此。