# File lib/transaction/simple.rb, line 221
  def rewind_transaction(name = nil)
    raise Transaction::TransactionError, ___tmessage[:cannot_rewind_no_transaction] if @__transaction_checkpoint__.nil?

    # Check to see if we are trying to rewind a transaction that is outside
    # of the current transaction block.
    defined? @__transaction_block__ or @__transaction_block__ = nil
    if @__transaction_block__ and name
      nix = @__transaction_names__.index(name) + 1
      raise Transaction::TransactionError, ___tmessage[:cannot_rewind_transaction_before_block] if nix < @__transaction_block__
    end

    if name.nil?
      checkpoint = @__transaction_checkpoint__
      __rewind_this_transaction
      @__transaction_checkpoint__ = checkpoint
    else
      raise Transaction::TransactionError, ___tmessage[:cannot_rewind_named_transaction] % name.inspect unless @__transaction_names__.include?(name)

      while @__transaction_names__.last != name
        ___tdebug_checkpoint
        @__transaction_checkpoint__ = __rewind_this_transaction
        ___tdebug '<', ___tmessage[:rewind_transaction], name
        @__transaction_level__ -= 1
        @__transaction_names__.pop
      end

      checkpoint = @__transaction_checkpoint__
      __rewind_this_transaction
      @__transaction_checkpoint__ = checkpoint
    end

    ___tdebug '|', "%s(%s)", ___tmessage[:rewind_transaction], name.inspect
    ___tdebug_checkpoint

    self
  end