prestodb/presto · error · PrestoException

UNSUPPORTED_ISOLATION_LEVEL

UNSUPPORTED_ISOLATION_LEVEL

Error message

Connector supported isolation level %s does not meet requested isolation level %s

What it means

IsolationLevel.checkConnectorSupports verifies the connector's advertised isolation level satisfies the transaction's requested level. If it does not (e.g. connector only supports READ_COMMITTED but SERIALIZABLE was requested), it throws UNSUPPORTED_ISOLATION_LEVEL.

Source

Thrown at presto-spi/src/main/java/com/facebook/presto/spi/transaction/IsolationLevel.java:75

        this.value = value;
    }

    @ThriftEnumValue
    public int getValue()
    {
        return value;
    }

    @Override
    public String toString()
    {
        return name().replace('_', ' ');
    }

    public static void checkConnectorSupports(IsolationLevel supportedLevel, IsolationLevel requestedLevel)
    {
        if (!supportedLevel.meetsRequirementOf(requestedLevel)) {
            throw new PrestoException(UNSUPPORTED_ISOLATION_LEVEL, format("Connector supported isolation level %s does not meet requested isolation level %s", supportedLevel, requestedLevel));
        }
    }
}

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Lower the session's transaction isolation level to one the connector supports
  2. Remove the isolation-level requirement (use auto-commit) if the connector cannot elevate
  3. Add real transaction support to the connector and declare the higher level
  4. Check connector documentation for supported isolation levels

Example fix

// before
START TRANSACTION ISOLATION LEVEL SERIALIZABLE;
// after
START TRANSACTION ISOLATION LEVEL READ COMMITTED;
Defensive patterns

Strategy: try-catch

Validate before calling

IsolationLevel supported = connectorMetadata.supportsIsolationLevel(...); if (!supported.meetsRequirementOf(requestedLevel)) { requestedLevel = IsolationLevel.READ_COMMITTED; }

Try / catch

try { startTransaction(requestedLevel); } catch (PrestoException e) { if (e.getErrorCode().getCode() == StandardErrorCode.UNSUPPORTED_ISOLATION_LEVEL.toErrorCode().getCode()) { startTransaction(IsolationLevel.READ_COMMITTED); } else { throw e; } }

Prevention

When it happens

Trigger: Starting/using a transaction whose requested isolation level exceeds what the connector declares in connectorMetadata support calls, e.g. BEGIN ISOLATION LEVEL SERIALIZABLE against a READ_COMMITTED-only connector.

Common situations: Clients specifying SERIALIZABLE/REPEATABLE_READ against connectors (like early Kafka or simple catalog connectors) that only support READ_COMMITTED or READ_UNCOMMITTED.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/8ef2eb45450cd2fb. Report an issue: GitHub.