def commit
if block_given?
raise "Illegal state for commit with block: #{@state}" unless @state == :none
begin
self.begin
rval = within { |*block_args| yield(*block_args) }
self.commit if @state == :begin
return rval
rescue Exception => e
self.rollback if @state == :begin
raise e
end
else
raise "Illegal state for commit without block: #{@state}" unless @state == :begin
each_adapter(:prepare_adapter, [:rollback_and_close_adapter_if_begin, :rollback_prepared_and_close_adapter_if_prepare])
each_adapter(:commit_adapter, [:log_fatal_transaction_breakage])
each_adapter(:close_adapter, [:log_fatal_transaction_breakage])
@state = :commit
end
end