gpt4 book ai didi

ruby-on-rails - 检查 activerecord 是否锁定在 "updating"状态

转载 作者:行者123 更新时间:2023-12-01 03:58:57 27 4
gpt4 key购买 nike

假设我有以下实体和关系:

A<-B<-C<-D<-E

对于同一个 A,我有很多 E(E 属于 A 到 D、C 和 B)

我有一个看起来像这样的代码片段:
eList=E.all
varA=eList.first.D.C.B.A

E.transaction do
...Operations that take some time...

varA.update_attributes(::last_update=>Time.now)
end

现在想想这个片段是用线程运行的。每个 E 实体一个线程。这意味着如果我有一个 A 的 10 个 E,那么这个代码段将同时运行 10 个线程。

我的问题与线路有关
varA.update_attributes(:last_update=>Time.now)

当我查看我的代码时,我发现我有这个:
[DEBUG] 2013/02/13 13:09:51 [66222] - abstract_adapter.rb:198 -   A Update (3107.1ms)   UPDATE "A" SET "updated_at" = '2013-02-13 13:09:47.932899', "last_update" = '2013-02-13 13:09:47.932209' WHERE "id" = 144
[DEBUG] 2013/02/13 13:09:54 [48600] - abstract_adapter.rb:198 - A Update (6812.2ms) UPDATE "A" SET "updated_at" = '2013-02-13 13:09:47.218032', "last_update" = '2013-02-13 13:09:47.217421' WHERE "id" = 144
[DEBUG] 2013/02/13 13:09:56 [66190] - abstract_adapter.rb:198 - A Update (6717.5ms) UPDATE "A" SET "updated_at" = '2013-02-13 13:09:49.328496', "last_update" = '2013-02-13 13:09:49.327777' WHERE "id" = 144
[DEBUG] 2013/02/13 13:09:59 [66219] - abstract_adapter.rb:198 - A Update (10816.2ms) UPDATE "A" SET "updated_at" = '2013-02-13 13:09:48.236539', "last_update" = '2013-02-13 13:09:48.235895' WHERE "id" = 144
[DEBUG] 2013/02/13 13:10:01 [66200] - abstract_adapter.rb:198 - A Update (13450.9ms) UPDATE "A" SET "updated_at" = '2013-02-13 13:09:47.584182', "last_update" = '2013-02-13 13:09:47.583467' WHERE "id" = 144

如您所见,每个线程运行每个查询的时间都会增加。第一个需要 3 秒,而最后一个需要 13 秒。我假设这是因为我正在更新相同的记录 (A.id=144),因此该记录被锁定,其他线程需要等待。

我的问题是,在 Rails 2.3 中有没有一种方法可以检测记录是否因为正在更新而被锁定,这样我就可以让其他线程跳过更新?

就像是:
if not varA.locked then varA.update_attributes(:last_update=>Time.now) end

对我来说只更新一次就足够了,所以我希望其他线程检查它是否已经更新并继续。

FWIW,我的数据库是 postgres 9.0

最佳答案

检查一行是否被锁定以进行更新在 PostgreSQL 中是一个相对复杂的过程,据我所知,只有在可以捕获 sql 异常的过程语言中才可行。如果 ActiveRecord 可以做到这一点,我会感到非常惊讶。

如果您需要这样做,您可能需要编写捕获这些异常并放到 SQL 中的存储过程。

关于ruby-on-rails - 检查 activerecord 是否锁定在 "updating"状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14886919/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com