使用 Neo4jrb gem,是否可以跨多个区块使用一个事务

Using the Neo4jrb gem, is it possible to use one transaction across multiple blocks

使用 neo4jrb/neo4j gem (8.x),我知道可以像这样 运行 在单个事务中进行多个查询

person = Person.find_by(id: person_id)

Neo4j::ActiveBase.run_transaction do |tx|
  person.update(name: 'New name')
  person.update(number: 1)
end

但是可以打开一个交易,然后在多个区块中使用同一个交易。类似于:

person = Person.find_by(id: person_id)

transaction = Neo4j::ActiveBase.new_transaction

transaction.run do |tx|
  person.update(name: 'New name')
end

transaction.run do |tx|
  person.update(number: 1)
end

transaction.close

之所以需要此功能,是因为我在 Trailblazer-Operation 中使用 Neo4jrb。开拓者操作被分解成离散的步骤,这些步骤本身被编写为单独的方法。我想要包含在一个事务中的几个步骤,但是,如果没有猴子修补操作,我无法在一个事务块中执行一些步骤。

谢谢!

原来我的问题有多个解决方案。

虽然我不是很明显是这种情况,但在 Neo4jrb 中创建新事务后,只要事务保持打开状态,同一会话中的任何后续查询都会自动与该事务相关联。

person = Person.find_by(id: person_id)

transaction = Neo4j::ActiveBase.new_transaction

one = person.update(name: 'New name')

two = person.update(number: 1)

transaction.close

在上面的示例中,onetwo 都作为 transaction 的一部分提交。所以这解决了我的问题。

我的问题的另一个解决方案是 trailblazer-operation 有一个特定的方法来将步骤包装在数据库事务块中,如 Trailblazer's website.

中所述
step Wrap ->(*, &block) { Sequel.transaction do block.call end } {
  step Model( Song, :new )
  step Contract::Build( constant: MyContract )
  step Contract::Validate( )
  step Contract::Persist( method: :sync )
}

在上面的示例中,step Wrap 中的所有 step 方法都在 Sequel.transaction 块的范围内调用。