在 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
发生之后被调用的,而不是之前。
我正在对我的 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
发生之后被调用的,而不是之前。