Method: Archipelago::Pirate::Captain#transaction

Defined in:
lib/archipelago/pirate.rb

#transaction(&block) ⇒ Object

Execute block within a transaction.

Will commit! transaction after the block is finished unless the transaction is aborted or commited already.

Will abort! the transaction if any exception is raised.



175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/archipelago/pirate.rb', line 175

def transaction(&block) #:yields: a clone of this Archipelago::Pirate::Captain with the given transaction as default @transaction.
  raise NoTransactionManagerAvailableException.new(self) if self.trannies.empty?

  my_clone = self.begin
  transa = my_clone.active_transaction
  begin
    begin
      return yield(my_clone)
    ensure
      raise CommitFailedException.new(my_clone, transa) unless transa.commit! == :commited
    end
  rescue Exception => e
    transa.abort! unless transa.state == :aborted
    raise e
  end
end