SET TRANSACTION 语句 用于执行BEGIN 之后,操作数据库语句之前,来设置事务隔离级别或优先级。

Note: 可以用来设置session的事务隔离级别。

概要

图片om/2621baba684fe8c4c729e5524bb675b2782fcff0)

所需权限

设置事务隔离级别和优先级无权限要求。但是用户必须具有事务中执行语句的权限。

参数

Par Description
ISOLATION LEVEL 在CockroachDB中,默认设置最强的ANSI隔离水平SERIALIZABLE。在这种隔离水平下,事务不会出现异常。 为了向后兼容,当前还支持SNAPSHOT 隔离水平,但是应该避免使用这个隔离级别。这个隔离级别在性能提升不多,但是在高负载情况下,会导致不一致状态的出现。 相关更多信息,请看 Transactions: Isolation Levels.

New in v2.0: 可以通过 session variable transaction_isolation查看事务隔离级别

Default: SERIALIZABLE
PRIORITY 如果不想事务使用NORMAL的优先级运行,可以设置成 LOW or HIGH.

拥有更高优先级的事务重试的概率会更小。

相关更多信息,请看 Transactions: Priorities.

当前优先级可以通过 session variable transaction_priority查看.

Default: NORMAL
READ New in v2.0: 将事务访问设置成 READ ONLY 或者 READ WRITE. 通过session variable transaction_read_only可以查看.

Default: READ WRITE

例子

设置事务隔离级别与优先级

可以将事务的给级别设置成 SNAPSHOT, 也可以将事务的优先级设置成 LOW or HIGH.

> BEGIN;
> SET TRANSACTION ISOLATION LEVEL SNAPSHOT, PRIORITY HIGH;

Tips: 可以将两个事务选项使用空格隔开,例如: SET TRANSACTION ISOLATION LEVEL SNAPSHOT PRIORITY HIGH

> SAVEPOINT cockroach_restart;
> UPDATE products SET inventory = 0 WHERE sku = '8675309';
> INSERT INTO orders (customer, sku, status) VALUES (1001, '8675309', 'new');
> RELEASE SAVEPOINT cockroach_restart;
> COMMIT;

Warning: 上面例子中,假设使用了 client-side intervention to handle transaction retries

设置 Session的事务隔离级别

使用 SET DEFAULT_TRANSACTION_ISOLATION TO <isolation level>设置客户端当前会话所有事务的隔离级别

> SHOW DEFAULT_TRANSACTION_ISOLATION;
+-------------------------------+
| default_transaction_isolation |
+-------------------------------+
| SERIALIZABLE                  |
+-------------------------------+
(1 row)
> SET DEFAULT_TRANSACTION_ISOLATION TO SNAPSHOT;
SET
> SHOW DEFAULT_TRANSACTION_ISOLATION;
+-------------------------------+
| default_transaction_isolation |
+-------------------------------+
| SNAPSHOT                      |
+-------------------------------+
(1 row)

See Also