2017-08-16 30 views
0

一個交易使用neo4jrb/neo4j寶石(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 

之所以這個功能是可取的,因爲我使用Neo4jrb一個Trailblazer-Operation內。開拓者操作被分解成獨立的步驟,這些步驟本身被編寫爲單獨的方法。我想要在事務中包裝幾個步驟,但是,如果沒有修補操作,我無法在一個事務塊內執行某些步驟。

謝謝!

回答

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'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 Wrapstep方法被稱爲Sequel.transaction塊的範圍內。

相關問題