在 Ruby 的 Sequel 中使用 after_commit 事务挂钩

Using after_commit transaction hook in Ruby's 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]]

有没有办法防止回调在交易中 运行?

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