【问题标题】:Using the Neo4jrb gem, is it possible to use one transaction across multiple blocks使用 Neo4jrb gem,是否可以跨多个块使用一个事务
【发布时间】:2017-08-16 13:07:15
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: trailblazer neo4jrb


    【解决方案1】:

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

    虽然我并没有立即发现这种情况,但在 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'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 块的范围内调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2011-05-24
      • 2021-05-27
      相关资源
      最近更新 更多