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 搭配使用时,您通常不需要修改此变量的值。这些驱动程序会在必要时执行 BEGIN 和 COMMIT,从而自动为您管理事务。使用 psql 等命令行工具时,您可以关闭 autocommit,以防止自动提交意外的数据修改。
SHOW [VARIABLE] AUTOCOMMIT
SET AUTOCOMMIT {TO|=} { true | false }
仅当没有活跃事务时,您才能更改此属性的值。
当 AUTOCOMMIT 设置为 false 时,在您执行 COMMIT 或 ROLLBACK 后,系统会自动启动新事务。您执行的第一个语句会启动事务。
▶ 示例:自动提交(点击可展开)
以下示例展示了如何使用 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。
时间戳边界选项如下所示:
STRONG指示 Spanner 执行强读取。MAX_STALENESS定义 Spanner 相对于now()执行有界限过时数据读取的时间间隔。MIN_READ_TIMESTAMP定义 Spanner 用于执行有界限过时数据读取的绝对时间。EXACT_STALENESS定义 Spanner 相对于now()执行精确过时数据读取的时间间隔。READ_TIMESTAMP定义 Spanner 执行精确过时数据读取的绝对时间。
时间戳必须采用以下格式:
YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]][timezone]
设置 MAX_STALENESS 和 EXACT_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;