> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cockroachlabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SET TRANSACTION

The `SET TRANSACTION` [statement](/docs/stable/sql-statements.md) sets the transaction priority, access mode, "as of" timestamp, and isolation level. These are applied after you [`BEGIN`](/docs/stable/begin-transaction) the transaction and before executing the first statement that manipulates a database.

Cockroach Labs recommends leaving the transaction priority at the default setting in almost all cases. Changing the transaction priority to `HIGH` in particular can lead to difficult-to-debug interactions with other transactions executing on the system.

If you are setting a transaction priority to avoid [contention](/docs/stable/performance-best-practices-overview.md#transaction-contention) or [hotspots](/docs/stable/understand-hotspots.md), or to [get better query performance](/docs/stable/make-queries-fast.md), it is usually a sign that you need to update your schema design and/or review the data access patterns of your workload.

## Synopsis

![set\_transaction syntax diagram](https://mintcdn.com/cockroachlabs/R40d76ku6ZWAJ59v/images/sql-diagrams/v26.3/set_transaction.svg?fit=max\&auto=format\&n=R40d76ku6ZWAJ59v\&q=85\&s=47732bfa6328409e5f549647d9a94847)

## Required privileges

No [privileges](/docs/stable/security-reference/authorization.md#managing-privileges) are required to set the transaction priority. However, privileges are required for each statement within a transaction.

## Parameters

| Parameter | Description |
| - | - |
| `PRIORITY` | If you do not want the transaction to run with `NORMAL` priority, you can set it to `LOW` or `HIGH`. Transactions with higher priority are less likely to need to be retried. For more information, see [Transactions: Priorities](/docs/stable/transactions.md#transaction-priorities). The current priority is also exposed as the read-only [session variable](/docs/stable/show-vars.md) `transaction_priority`. **Default**: `NORMAL` |
| `READ` | Set the transaction access mode to `READ ONLY` or `READ WRITE`. The current transaction access mode is also exposed as the [session variable](/docs/stable/show-vars.md) `transaction_read_only`. **Default**: `READ WRITE` |
| `AS OF SYSTEM TIME` | Execute the transaction using the database contents "as of" a specified time in the past.  The `AS OF SYSTEM TIME` clause can be used only when the transaction is read-only. If the transaction contains any writes, or if the `READ WRITE` mode is specified, an error will be returned. For more information, see [`AS OF SYSTEM TIME`](/docs/stable/as-of-system-time). |
| `NOT DEFERRABLE` `DEFERRABLE` | This clause is supported for compatibility with PostgreSQL. `NOT DEFERRABLE` is a no-op and the default behavior for CockroachDB. `DEFERRABLE` returns an `unimplemented` error. |
| `ISOLATION LEVEL` | Set the transaction isolation level. Transactions use `SERIALIZABLE` isolation by default. They can be configured to run at [`READ COMMITTED`](/docs/stable/read-committed) isolation. This clause only takes effect if specified at the beginning of the transaction. |

## Examples

### Set isolation level

You can set the transaction isolation level to [`SERIALIZABLE`](/docs/stable/demo-serializable) or [`READ COMMITTED`](/docs/stable/read-committed#enable-read-committed-isolation).

If not specified, transactions use the value of the current session's [`default_transaction_isolation`](/docs/stable/session-variables#default-transaction-isolation) variable.

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
BEGIN;
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
```

### Set priority

> [!CAUTION]
>
> This example assumes you're using client-side retry handling.

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> BEGIN;
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> SET TRANSACTION PRIORITY HIGH;
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> SAVEPOINT cockroach_restart;
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> UPDATE products SET inventory = 0 WHERE sku = '8675309';
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> INSERT INTO orders (customer, sku, status) VALUES (1001, '8675309', 'new');
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> RELEASE SAVEPOINT cockroach_restart;
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> COMMIT;
```

### Use the `AS OF SYSTEM TIME` option

You can execute the transaction using the database contents "as of" a specified time in the past.

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> BEGIN;
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> SET TRANSACTION AS OF SYSTEM TIME '2019-04-09 18:02:52.0+00:00';
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> SELECT * FROM orders;
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> SELECT * FROM products;
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> COMMIT;
```

### Set the default transaction priority for a session

To set the default transaction priority for all transactions in a session, use the `default_transaction_priority` [session variable](/docs/stable/set-vars.md). For example:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
SET default_transaction_priority = 'high';
```

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
SHOW transaction_priority;
```

```
  transaction_priority
------------------------
  high
```

Note that `transaction_priority` is a read-only [session variable](/docs/stable/show-vars.md) that cannot be set directly.

## See also

* [`SET`](/docs/stable/set-vars)
* [Transactions: Priority levels](/docs/stable/transactions.md#transaction-priorities)
* [`BEGIN`](/docs/stable/begin-transaction)
* [`COMMIT`](/docs/stable/commit-transaction)
* [`SAVEPOINT`](/docs/stable/savepoint)
* [`RELEASE SAVEPOINT`](/docs/stable/release-savepoint)
* [`ROLLBACK`](/docs/stable/rollback-transaction)
