PGAdapter 会话管理命令

Spanner PGAdapter 支持会话管理语句,让您可以修改连接的状态和行为、执行事务并高效执行批量语句。本文档中描述的所有语句都可以与连接到 PGAdapter 的任何客户端或驱动程序搭配使用。

如需了解详情,请参阅受支持的 PostgreSQL 驱动程序和 ORM 的完整列表。以下命令适用于 PostgreSQL 方言数据库。

如需详细了解如何使用 PGAdapter,请参阅启动 PGAdapter

连接语句

以下语句会更改或显示当前连接的属性。

SPANNER.READONLY

一个布尔值,指示连接是否处于只读模式。默认为 false

SHOW [VARIABLE] SPANNER.READONLY
SET SPANNER.READONLY {TO|=} { true | false }

仅当没有活跃事务时,您才能更改此属性的值。

▶ 示例:只读事务(点击可展开)
以下示例展示了如何使用此属性在 Spanner 中执行只读事务。

SET SPANNER.READONLY = TRUE;
-- This transaction is a read-only transaction.
BEGIN TRANSACTION;

-- The following two queries both use the read-only transaction.
SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SELECT first_name, last_name
FROM albums
ORDER BY title;

-- This shows the read timestamp that was used for the two queries.
SHOW SPANNER.READ_TIMESTAMP;

-- This marks the end of the read-only transaction. The next statement will
-- start a new read-only transaction.
COMMIT;

AUTOCOMMIT

一个布尔值,用于指示连接是否处于自动提交模式。默认为 true

NOTE:将 PostgreSQL 驱动程序与 PGAdapter 搭配使用时,您通常不需要修改此变量的值。这些驱动程序会在必要时执行 BEGINCOMMIT,从而自动为您管理事务。使用 psql 等命令行工具时,您可以关闭 autocommit,以防止自动提交意外的数据修改。

SHOW [VARIABLE] AUTOCOMMIT
SET AUTOCOMMIT {TO|=} { true | false }

仅当没有活跃事务时,您才能更改此属性的值。

AUTOCOMMIT 设置为 false 时,在您执行 COMMITROLLBACK 后,系统会自动启动新事务。您执行的第一个语句会启动事务。

▶ 示例:自动提交(点击可展开)
以下示例展示了如何使用 autocommit 属性。

-- The default value for AUTOCOMMIT is true.
SHOW AUTOCOMMIT;

-- This insert statement is automatically committed after it is executed, as
-- the connection is in autocommit mode.
INSERT INTO T (id, col_a, col_b) VALUES (1, 100, 1);

-- Turning off autocommit means that a new transaction is automatically started
-- when the next statement is executed.
SET AUTOCOMMIT = FALSE;
-- The following statement starts a new transaction.
INSERT INTO T (id, col_a, col_b) VALUES (2, 200, 2);

-- This statement uses the same transaction as the previous statement.
INSERT INTO T (id, col_a, col_b) VALUES (3, 300, 3);

-- Commit the current transaction with the two INSERT statements.
COMMIT;

-- Transactions can also be executed in autocommit mode by executing the BEGIN
-- statement.
SET AUTOCOMMIT = TRUE;

-- Execute a transaction while in autocommit mode.
BEGIN;
INSERT INTO T (id, col_a, col_b) VALUES (4, 400, 4);
INSERT INTO T (id, col_a, col_b) VALUES (5, 500, 5);
COMMIT;

SPANNER.RETRY_ABORTS_INTERNALLY

布尔值,指示连接是否自动重试已中止的事务。默认值为 true

SHOW [VARIABLE] SPANNER.RETRY_ABORTS_INTERNALLY
SET SPANNER.RETRY_ABORTS_INTERNALLY {TO|=} { true | false }

只有在事务开始后(请参阅 BEGIN [TRANSACTION | WORK])且在事务内执行任何语句之前,才能执行此命令。

启用 SPANNER.RETRY_ABORTS_INTERNALLY 后,连接会保留连接返回给客户端应用的所有数据的校验和。这用于在事务被 Spanner 中止时重试事务。

此设置默认为启用状态。如果您已经在应用中重试中止的事务,我们建议您停用此设置。

SPANNER.AUTOCOMMIT_DML_MODE

一个 STRING 属性,用于指示数据操纵语言 (DML) 语句的自动提交模式。

SHOW [VARIABLE] SPANNER.AUTOCOMMIT_DML_MODE
SET SPANNER.AUTOCOMMIT_DML_MODE {TO|=} { 'TRANSACTIONAL' | 'PARTITIONED_NON_ATOMIC' }

可能的值包括:

  • TRANSACTIONAL 模式下,驱动程序将 DML 语句作为单独的原子化事务执行。驱动程序会创建新事务、执行 DML 语句,并在成功执行后提交事务,或在发生错误时回滚事务。
  • PARTITIONED_NON_ATOMIC 模式下,驱动程序将 DML 语句作为分区更新语句执行。分区更新语句可以作为一系列多个事务运行,每个事务均涵盖一部分受影响的行。分区语句会提供弱化语义,从而换取更高的可伸缩性和性能。

默认值为 TRANSACTIONAL

▶ 示例:分区 DML(点击可展开)
以下示例展示了如何使用 PGAdapter 执行分区 DML

-- Change autocommit DML mode to use Partitioned DML.
SET SPANNER.AUTOCOMMIT_DML_MODE = 'PARTITIONED_NON_ATOMIC';

-- Delete all singers that have been marked as inactive.
-- This statement is executed using Partitioned DML.
DELETE
FROM singers
WHERE active=false;

-- Change DML mode back to standard `TRANSACTIONAL`.
SET SPANNER.AUTOCOMMIT_DML_MODE = 'TRANSACTIONAL';

STATEMENT_TIMEOUT

类型为 STRING 的属性,用于指示语句的当前超时值。

SHOW [VARIABLE] STATEMENT_TIMEOUT
SET STATEMENT_TIMEOUT {TO|=} { '<int8>{ s | ms | us | ns }' | <int8> | DEFAULT }

int8 值为一个整数,后跟表示时间单位的后缀。值 DEFAULT 表示未设置超时值。如果已设置语句超时值,则超过指定超时值的语句将导致超时错误并使事务失效。

受支持的时间单位包括:

  • s:秒
  • ms:毫秒
  • us:微秒
  • ns:纳秒

DEFAULT 为 0 秒,表示不超时。不带单位的 int8 数值表示 int8 ms。例如,以下两个命令都将语句超时设置为 2 秒。

SET STATEMENT_TIMEOUT TO 2000;
SET STATEMENT_TIMEOUT TO '2s';

事务期间语句超时会使事务失效,失效事务中的所有后续语句(ROLLBACK 除外)均会失败。

READ_ONLY_STALENESS

类型为 STRING 的属性,用于指示 Spanner 用于只读事务和 AUTOCOMMIT 模式下的查询的当前只读过时设置

SHOW [VARIABLE] SPANNER.READ_ONLY_STALENESS
SET SPANNER.READ_ONLY_STALENESS {TO|=} staleness_type

staleness_type:

{ 'STRONG'
  | 'MIN_READ_TIMESTAMP timestamp'
  | 'READ_TIMESTAMP timestamp'
  | 'MAX_STALENESS <int8>{ s | ms | us | ns }'
  | 'EXACT_STALENESS <int8>{ s | ms | us | ns }' }

只读过时值会应用于所有后续的只读事务以及 AUTOCOMMIT 模式下的所有查询。

默认值为 STRONG

时间戳边界选项如下所示:

时间戳必须采用以下格式:

YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]][timezone]

设置 MAX_STALENESSEXACT_STALENESS 值所支持的时间单位包括:

  • s:秒
  • ms:毫秒
  • us:微秒
  • ns:纳秒

仅当没有活跃事务时,您才能修改此属性的值。

▶ 示例:只读过时(点击可展开)
以下示例展示了如何使用 PGAdapter 使用自定义过期值执行查询。

-- Set the read-only staleness to MAX_STALENESS 10 seconds.
SET SPANNER.READ_ONLY_STALENESS = 'MAX_STALENESS 10s';

-- Execute a query in auto-commit mode. This will return results that are up to
-- 10 seconds stale.
SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Read-only staleness can also be applied to read-only transactions.
-- MAX_STALENESS is however only allowed for queries in autocommit mode.
-- Change the staleness to EXACT_STALENESS and start a read-only transaction.
SET SPANNER.READ_ONLY_STALENESS = 'EXACT_STALENESS 10s';
BEGIN;
SET TRANSACTION READ ONLY;

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SELECT title, singer_id
FROM albums
ORDER BY title;

COMMIT;

-- Read staleness can also be an exact timestamp.
SET SPANNER.READ_ONLY_STALENESS = 'READ_TIMESTAMP 2024-01-26T10:36:00Z';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SPANNER.OPTIMIZER_VERSION

类型为 STRING 的属性,用于指示优化器版本。版本可以是数字,也可以是“LATEST”。

SHOW [VARIABLE] SPANNER.OPTIMIZER_VERSION
SET SPANNER.OPTIMIZER_VERSION {TO|=} { 'version'|'LATEST'|'' }

为连接中的所有后续语句设置要使用的优化器版本。将优化器版本设置为 ''(空字符串)表示使用最新版本。如果未设置优化器版本,Spanner 会使用在数据库级层设置的优化器版本。

默认值为 ''

▶ 示例:优化器版本(点击可展开)
以下示例展示了如何通过 PGAdapter 使用特定的优化器版本执行查询。

-- Set the optimizer version to 5 and execute a query.
SET SPANNER.OPTIMIZER_VERSION = '5';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Execute the same query with the latest optimizer version.
SET SPANNER.OPTIMIZER_VERSION = 'LATEST';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Revert back to using the default optimizer version that has been set for the
-- database.
SET SPANNER.OPTIMIZER_VERSION = '';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SPANNER.OPTIMIZER_STATISTICS_PACKAGE

类型为 STRING 的属性,用于指示此连接使用的当前优化器统计信息软件包

SHOW [VARIABLE] SPANNER.OPTIMIZER_STATISTICS_PACKAGE
SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE {TO|=} { 'package'|'' }

为连接中的所有后续语句设置要使用的优化器统计信息软件包。<package> 必须是有效的软件包名称。如果未设置优化器统计信息软件包,Spanner 会使用在数据库级别设置的优化器统计信息软件包。

默认值为 ''

▶ 示例:优化器统计信息软件包(点击可展开)
以下示例展示了如何通过 PGAdapter 使用特定的优化器统计信息软件包执行查询。

-- Show the available optimizer statistics packages in this database.
SELECT * FROM INFORMATION_SCHEMA.SPANNER_STATISTICS;

-- Set the optimizer statistics package and execute a query.
SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE = 'auto_20240124_06_47_29UTC';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Execute the same query with the default optimizer statistics package.
SET SPANNER.OPTIMIZER_VERSION = '';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

SPANNER.RETURN_COMMIT_STATS

类型为 BOOL 的属性,用于指示是否应针对此连接中的事务返回统计信息。您可以通过执行 SHOW [VARIABLE] COMMIT_RESPONSE 命令来查看返回的统计信息。

SHOW [VARIABLE] SPANNER.RETURN_COMMIT_STATS
SET SPANNER.RETURN_COMMIT_STATS {TO|=} { true | false }

默认值为 false

▶ 示例:提交统计信息(点击可展开)
以下示例展示了如何使用 PGAdapter 查看事务的提交统计信息。

-- Enable the returning of commit stats.
SET SPANNER.RETURN_COMMIT_STATS = true;

-- Execute a transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1), (2, 200, 2), (3, 300, 3);
COMMIT;

-- View the commit response with the transaction statistics for the last
-- transaction that was committed.
SHOW SPANNER.COMMIT_RESPONSE;

SPANNER.RPC_PRIORITY

类型为 STRING 的属性,用于指示 Spanner 请求的相对优先级。优先级充当 Spanner 调度器的提示,并不保证执行顺序。

SHOW [VARIABLE] SPANNER.RPC_PRIORITY
SET SPANNER.RPC_PRIORITY {TO|=} {'HIGH'|'MEDIUM'|'LOW'|'NULL'}

'NULL' 表示请求中不应包含任何提示。

默认值为 'NULL'

您还可以使用语句提示来指定 RPC 优先级:

/*@RPC_PRIORITY=PRIORITY_LOW*/ SELECT * FROM Albums

如需了解详情,请参阅 Priority

事务语句

以下语句用于管理和提交 Spanner 事务。

TRANSACTION ISOLATION LEVEL

SHOW [ VARIABLE ] TRANSACTION ISOLATION LEVEL

返回一个结果集,其中包含 STRING 类型的一行和一列。返回值始终为 serializable,因为这是 Spanner PostgreSQL 方言数据库唯一支持的隔离级别。

SPANNER.READ_TIMESTAMP

SHOW [VARIABLE] SPANNER.READ_TIMESTAMP

返回一个结果集,其中包含 TIMESTAMP 类型的一行和一列,该结果集包括最近一次只读事务的读取时间戳。只有在只读事务仍处于活跃状态并且已执行至少一个查询时,或者只有在紧接着已提交只读事务之后且新事务启动之前,此语句才会返回时间戳。否则,结果为 NULL

▶ 示例:读取时间戳(点击可展开)
以下示例展示了如何使用 PGAdapter 查看只读操作的最后读取时间戳。

-- Execute a query in autocommit mode using the default read-only staleness
-- (strong).
SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Shows the read timestamp that was used for the previous query.
SHOW SPANNER.READ_TIMESTAMP;

-- Set a non-deterministic read-only staleness and execute the same query.
SET SPANNER.READ_ONLY_STALENESS = 'MAX_STALENESS 20s';

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Shows the read timestamp that was used for the previous query. The timestamp
-- is determined by Spanner, and is guaranteed to be no less than 20
-- seconds stale.
SHOW SPANNER.READ_TIMESTAMP;

-- The read timestamp of a read-only transaction can also be retrieved.
SET SPANNER.READ_ONLY_STALENESS = 'STRONG';
BEGIN;
SET TRANSACTION READ ONLY;

SELECT first_name, last_name
FROM singers
ORDER BY last_name;

-- Shows the read timestamp of the current read-only transaction. All queries in
-- this transaction will use this read timestamp.
SHOW SPANNER.READ_TIMESTAMP;

SELECT title
FROM albums
ORDER BY title;

-- The read timestamp is the same as for the previous query, as all queries in
-- the same transaction use the same read timestamp.
SHOW SPANNER.READ_TIMESTAMP;

COMMIT;