VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

SET TRANSACTION

SET TRANSACTION - 设置当前事务的特征

语法格式

SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]

其中 transaction_mode 是下列之一:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
    [ NOT ] DEFERRABLE

说明

SET TRANSACTION 命令设置当前事务的特征。它对任何后续 Transaction都没有影响。 SET SESSION CHARACTERISTICS 为会话的后续事务设置默认事务特征。对于单个事务, SET TRANSACTION可以覆盖这些默认值。

可用的事务特征是事务隔离级别,事务访问模式(读/写或只读)和可延迟模式。此外,可以选择快照,但仅限于当前事务,而不是会话默认值。

事务的隔离级别确定当其他事务同时运行时事务可以看到的数据:

  • READ COMMITTED

    语句只能看到在开始之前提交的行。这是默认值。

  • REPEATABLE READ

    当前事务的所有语句只能看到在此事务中执行第一个查询或数据修改语句之前提交的行。

  • SERIALIZABLE

    当前事务的所有语句只能看到在此事务中执行第一个查询或数据修改语句之前提交的行。如果并发可序列化事务之间的读写模式会产生这些事务的任何串行(一次一个)执行不会发生的情况,其中一个将回滚serialization_failure 错误。

SQL标准定义了一个额外的级别 READ UNCOMMITTED 。在Vastbase E100中 READ UNCOMMITTED 被视为 READ COMMITTED 。

在执行了事务的第一个查询或数据修改语句( SELECT , INSERT , DELETE ,UPDATE , FETCH 或 COPY)之后,无法更改事务隔离级别。事务访问模式确定事务是读/写还是只读。读/写是默认值。如果事务是只读的,则不允许使用以下SQL命令:INSERT , UPDATE , DELETE 和 COPY FROM 如果要写入的表不是临时表;所有CREATE , ALTER 和 DROP 命令; COMMENT , GRANT , REVOKE , TRUNCATE ;和EXPLAIN ANALYZE 和 EXECUTE如果他们将执行的命令是列出的命令之一。这是一种只读的高级概念,它不会阻止对磁盘的所有写入。

除非事务也是 SERIALIZABLE 和 READ ONLY ,否则 DEFERRABLE事务属性无效。当为事务选择了所有这三个属性时,事务可能会在第一次获取其快照时阻塞,之后它可以在没有SERIALIZABLE事务的正常开销的情况下运行,并且没有任何因序列化而导致或被取消的风险失败。此模式非常适合长时间运行的报告或备份。

SET TRANSACTION SNAPSHOT命令允许新事务使用与现有事务相同的快照运行。预先存在的事务必须已使用pg_export_snapshot 函数导出其快照。该函数返回一个快照标识符,必须将其赋予 SET TRANSACTION SNAPSHOT 以指定要导入的快照。必须在此命令中将标识符写为字符串文字,例如'000003A1-1' 。 SET TRANSACTION SNAPSHOT只能在事务开始时,在事务的第一个查询或数据修改语句( SELECT , INSERT ,DELETE , UPDATE , FETCH 或 COPY )之前执行。此外,事务必须已设置为SERIALIZABLE 或 REPEATABLE READ 隔离级别(否则,快照将立即被丢弃,因为READ COMMITTED mode为每个命令获取新快照)。如果导入事务使用 SERIALIZABLE隔离级别,则导出快照的事务也必须使用该隔离级别。此外,非只读可序列化事务无法从只读事务导入快照。

注意事项

如果 SET TRANSACTION 在没有事先 START TRANSACTION 或 BEGIN的情况下执行,则会发出警告,否则无效。

通过在 BEGIN 或 START TRANSACTION 中指定所需的 transaction_modes,可以省去 SET TRANSACTION 。但该选项不适用于 SET TRANSACTION SNAPSHOT。

也可以通过设置配置参数说明 default_transaction_isolation,_1068600_和 default_transaction_deferrable来设置会话默认事务模式。 (实际上 SET SESSION CHARACTERISTICS 只是用 SET设置这些变量的详细等价。)这意味着可以通过 ALTER DATABASE等在配置文件中设置默认值。

示例

要使用与现有事务相同的快照开始新事务,请首先从现有事务中导出快照Transaction 。这将返回快照标识符,例如:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
 pg_export_snapshot
---------------------
 00000003-0000001B-1
(1 row)

然后在新打开的事务开头的 SET TRANSACTION SNAPSHOT 命令中给出快照标识符:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT '00000003-0000001B-1';

兼容性

这些命令在SQL标准中定义,除了 DEFERRABLE 事务模式和 SET TRANSACTION SNAPSHOT 表单,它们是Vastbase E100扩展。

SERIALIZABLE 是标准中的默认事务隔离级别。在Vastbase E100中,默认值通常为 READ COMMITTED ,但您可以如上所述更改它。

在SQL标准中,还有一个可以使用这些命令设置的事务特性:诊断区域的大小。此概念特定于嵌入式SQL,因此未在Vastbase E100服务器中实现。

SQL标准需要连续 transaction_modes 之间的逗号,但由于历史原因,Vastbase E100允许省略逗号。