0

使用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 。开拓者操作被分解为离散的步骤,这些步骤本身被编写为单独的方法。我想要几个步骤包含在一个事务中,但是,如果没有猴子修补操作,我没有能力在一个事务块内执行一些步骤。

谢谢!

4

1 回答 1

0

所以事实证明我的问题有多种解决方案。

虽然我并没有立即明白这种情况,但在 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有一种将步骤包装在 db 事务块中的特定方法,如Trailblazer 的网站上所述。

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里面的所有方法step Wrap都是在块的范围内调用的Sequel.transaction

于 2017-08-16T15:54:45.713 回答