jackc/pgx · error

unsupported isolation

Error message

unsupported isolation: %v

What it means

stdlib Conn.BeginTx maps database/sql isolation levels onto pgx levels and falls into the default branch for any level outside the supported set (e.g. sql.LevelLinearizable), which has no PostgreSQL equivalent.

Solutions

  1. Use a supported isolation level (Default through Serializable)
  2. Use the native pgx API with explicit pgx.TxOptions for exotic levels
  3. Use pgx.SerializableDeferrable via TxOptions when deferrable serializable is needed
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at stdlib/sql.go:473 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of jackc/pgx@ec1a0befd2 (2026-08-04). Data as JSON: /api/errors/8aeca0e4e729a155. Report an issue: GitHub.

Appendix: source

Thrown at stdlib/sql.go:473

func (c *Conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) {
	if c.conn.IsClosed() {
		return nil, driver.ErrBadConn
	}

	var pgxOpts pgx.TxOptions
	switch sql.IsolationLevel(opts.Isolation) {
	case sql.LevelDefault:
	case sql.LevelReadUncommitted:
		pgxOpts.IsoLevel = pgx.ReadUncommitted
	case sql.LevelReadCommitted:
		pgxOpts.IsoLevel = pgx.ReadCommitted
	case sql.LevelRepeatableRead, sql.LevelSnapshot:
		pgxOpts.IsoLevel = pgx.RepeatableRead
	case sql.LevelSerializable:
		pgxOpts.IsoLevel = pgx.Serializable
	default:
		return nil, fmt.Errorf("unsupported isolation: %v", opts.Isolation)
	}

	if opts.ReadOnly {
		pgxOpts.AccessMode = pgx.ReadOnly
	}

	tx, err := c.conn.BeginTx(ctx, pgxOpts)
	if err != nil {
		return nil, err
	}

	return wrapTx{ctx: ctx, tx: tx}, nil
}

func (c *Conn) ExecContext(ctx context.Context, query string, argsV []driver.NamedValue) (driver.Result, error) {
	if c.conn.IsClosed() {
		return nil, driver.ErrBadConn
	}

View on GitHub (pinned to ec1a0befd2)