在Ruby的续集中使用after_commit事务挂钩

时间:2015-03-06 05:20:31

标签: ruby transactions sequel

我正在对Postgres数据库进行一系列更新。在这些更新的中途,我需要运行一大块代码,这些代码也会修改数据库,但不能在事务中

我发现了DB.after_commit事务挂钩,看起来很完美,除了它没有表现出我的预期:

acc = []
acc << ["before", DB.in_transaction?]
DB.transaction do
    acc << ["inside", DB.in_transaction?]
    SomeModel.create(value: "foo")
    DB.after_commit {
        acc << ["after_commit", DB.in_transaction?]
    }
end
acc << ["after", DB.in_transaction?]

我希望acc[["before",false],["inside",true],["after_commit",false],["after",false]],但我看到[["before",false],["inside",true],["after_commit",true],["after",false]]

有没有办法阻止回调在事务中运行?

1 个答案:

答案 0 :(得分:1)

Database#in_transaction?after_commit区块内显然不准确。但是after_commit肯定会在COMMIT发生之后被调用,而不是之前。