使用 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
在上面的示例中,one
和 two
都作为 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
块的范围内调用。
使用 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
在上面的示例中,one
和 two
都作为 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
块的范围内调用。