2017-08-16 4 views
0

Mit dem neo4jrb/neo4j Juwel (8.x) zu verwenden, ich weiß, ist es möglich, mehrere Abfragen innerhalb einer einzigen Transaktion laufen wie sodas Neo4jrb Juwel, ist es möglich, eine Transaktion über mehrere Blöcke

person = Person.find_by(id: person_id) 

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

Es ist jedoch möglich, eine Transaktion zu öffnen und diese Transaktion dann für mehrere Blöcke zu verwenden. Etwas wie:

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 

Der Grund, warum diese Funktionalität wünschenswert ist, ist, weil ich bin mit Neo4jrb innerhalb eines Trailblazer-Operation. Die Vorreiteroperation ist in einzelne Schritte unterteilt, die selbst als separate Methoden geschrieben werden. Ich möchte, dass mehrere Schritte in eine Transaktion eingepackt werden, aber ohne die Operation mit einem Affe zu patchen, habe ich nicht die Möglichkeit, einige Schritte innerhalb eines Transaktionsblocks auszuführen.

Danke!

Antwort

0

So stellt sich heraus, dass mein Problem mehrere Lösungen hat.

Während es mir nicht sofort klar war, dass dies der Fall ist, werden nach dem Erstellen einer neuen Transaktion in Neo4jrb alle nachfolgenden Abfragen in derselben Sitzung automatisch mit der Transaktion verknüpft, solange sie geöffnet bleibt.

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 

In dem obigen Beispiel beide one und two werden als Teil der transaction verpflichtet. So löst das mein Problem.

Eine andere Lösung für mein Problem ist, dass trailblazer-operation zum Einwickeln von Schritten in einem db Transaktionsblock eine bestimmte Methode hat, wie auf Trailblazer's website dokumentiert.

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) 
} 

In dem obigen Beispiel werden alle der step Methoden innerhalb step Wrap werden im Rahmen des Sequel.transaction Block bezeichnet.

Verwandte Themen