qishibo/AnotherRedisDesktopManager · warning

(error) ERR EXEC without MULTI

Error message

(error) ERR EXEC without MULTI

What it means

Same client-side transaction guard as DISCARD: EXEC is only valid while multiQueue is an Array (set by MULTI). When it is null, the CLI locally echoes '(error) ERR EXEC without MULTI' instead of sending anoClient.multi(multiQueue).execBuffer(). No network round-trip occurs.

Source

Thrown at src/components/CliTab.vue:232

        this.multiQueue = [];
        return this.scrollToBottom('OK');
      }

      // multi-discard-mode
      if (paramsArr[0] == 'discard') {
      // discard when not multi condition
        if (!Array.isArray(this.multiQueue)) {
          return this.scrollToBottom('(error) ERR DISCARD without MULTI');
        }
        this.multiQueue = null;
        return this.scrollToBottom('OK');
      }

      // multi dequeue
      if (paramsArr[0] == 'exec') {
        // exec when not multi condition
        if (!Array.isArray(this.multiQueue)) {
          return this.scrollToBottom('(error) ERR EXEC without MULTI');
        }

        this.anoClient.multi(this.multiQueue).execBuffer((err, reply) => {
          if (err) {
            this.content.push(`${err}`);
          } else {
            this.content.push(this.resolveResult(reply).trim());
          }

          this.scrollToBottom();
        });

        return this.multiQueue = null;
      }

      // multi enqueue
      if (Array.isArray(this.multiQueue)) {
        this.multiQueue.push(['callBuffer', paramsArr[0], ...paramsArr.slice(1)]);

View on GitHub (pinned to c149855106)

Solutions

  1. Begin with MULTI, queue commands, then EXEC
  2. Review prior output to see whether an earlier EXEC/DISCARD or error already ended the transaction
  3. Re-issue the full MULTI ... EXEC sequence
Defensive patterns

Strategy: validation

Validate before calling

// validate local transaction state before EXEC
function canExec(multiQueue) {
  return Array.isArray(multiQueue) && multiQueue.length >= 0;
}

if (paramsArr[0] === 'exec' && !canExec(this.multiQueue)) {
  return this.scrollToBottom('no MULTI in progress - type MULTI first');
}

Prevention

When it happens

Trigger: Typing EXEC in the workbench CLI before any MULTI; after a prior EXEC consumed the queue; or after a failed command's .catch reset multiQueue to null mid-transaction.

Common situations: Replaying pasted transaction scripts, switching tabs mid-MULTI and losing track of state, queue aborted by an errored queued command.

Related errors


AI-assisted analysis of qishibo/AnotherRedisDesktopManager@c149855106 (2026-08-22). Data as JSON: /api/errors/b42f9c85b11641a6. Report an issue: GitHub.