Der Spanner-JDBC-Treiber (Java Database Connectivity) unterstützt Sitzungen Management-Anweisungen, mit denen Sie den Status Ihrer Verbindung, Transaktionen und Anweisungs-Batches effizient ausführen.
Die folgenden Befehle gelten für PostgreSQL-Dialekt-Datenbanken.
Verbindungsanweisungen
Mit den folgenden Anweisungen werden die Eigenschaften der aktuellen Verbindung geändert oder aufgerufen.
SPANNER.READONLY
Ein boolescher Wert, der angibt, ob sich die Verbindung im Lesemodus befindet. Der Standardwert von false
ist.
SHOW [VARIABLE] SPANNER.READONLY
SET SPANNER.READONLY {TO|=} { true | false }
Sie können den Wert dieser Eigenschaft nur ändern, wenn keine aktiven Transaktion.
▶ Beispiel: Schreibgeschützte Transaktion (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie Sie mit dieser Eigenschaft einen schreibgeschützten Zugriff ausführen
Transaktionen in 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 FirstName, LastName
FROM Singers
ORDER BY LastName;
SELECT Title
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 starts
-- a new read-only transaction.
COMMIT;
AUTOCOMMIT
Ein boolescher Wert, der angibt, ob sich die Verbindung im Autocommit-Modus befindet. Der Standardwert von true
ist.
SHOW [VARIABLE] AUTOCOMMIT
SET AUTOCOMMIT {TO|=} { true | false }
Sie können den Wert dieser Property nur ändern, wenn keine aktive Transaktion vorhanden ist.
Wenn AUTOCOMMIT
auf „false“ gesetzt ist, wird nach Ausführung von COMMIT
oder ROLLBACK
automatisch eine neue Transaktion gestartet. Die erste Anweisung, die Sie ausführen,
startet die Transaktion.
▶ Beispiel: Autocommit (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie die Eigenschaft autocommit
verwendet wird.
-- 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 = FALSE;
-- 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
Ein boolescher Wert, der angibt, ob die Verbindung abgebrochene Transaktionen automatisch wiederholt. Der Standardwert ist true
.
SHOW [VARIABLE] SPANNER.RETRY_ABORTS_INTERNALLY
SET SPANNER.RETRY_ABORTS_INTERNALLY {TO|=} { true | false }
Sie können den Wert dieser Eigenschaft erst ändern, nachdem eine Transaktion gestartet wurde
(siehe BEGIN TRANSACTION
) und davor
Alle Anweisungen werden innerhalb der Transaktion ausgeführt.
Wenn Sie SPANNER.RETRY_ABORTS_INTERNALLY
auf „true“ setzen, bleibt die Verbindung
Prüfsumme aller Daten, die die Verbindung an die Clientanwendung zurückgibt. Damit wird die Transaktion wiederholt, wenn sie von Spanner abgebrochen wird.
Der Standardwert ist true
. Wir empfehlen, diesen Wert auf false
festzulegen, wenn
Ihre Anwendung wiederholt bereits abgebrochene Transaktionen.
SPANNER.AUTOCOMMIT_DML_MODE
Eine STRING
-Eigenschaft, die den Autocommit-Modus für Anweisungen in der Datenbearbeitungssprache (Data-Manipulation Language, DML) angibt.
SHOW [VARIABLE] SPANNER.AUTOCOMMIT_DML_MODE
SET SPANNER.AUTOCOMMIT_DML_MODE {TO|=} { 'TRANSACTIONAL' | 'PARTITIONED_NON_ATOMIC' }
Die möglichen Werte sind:
- Im
TRANSACTIONAL
-Modus führt der Treiber DML-Anweisungen als separate atomare Transaktionen aus. Der Treiber erstellt eine neue Transaktion, führt die DML-Anweisung aus und lässt danach entweder bei erfolgreicher Ausführung ein Commit oder im Falle eines Fehlers ein Rollback der Transaktion durchführen. - Im
PARTITIONED_NON_ATOMIC
-Modus führt der Treiber DML-Anweisungen als partitionierte Aktualisierungsanweisungen aus. Eine partitionierte Aktualisierungsanweisung kann als eine Reihe von mehreren Transaktionen ausgeführt werden, wobei jede davon eine Teilmenge der betroffenen Zeilen abdeckt. Die partitionierte Anweisung liefert abgeschwächter Semantik im Austausch für bessere Skalierbarkeit und Leistung.
Der Standardwert ist TRANSACTIONAL
.
▶ Beispiel: Partitionierte DML (zum Maximieren klicken)
Im folgenden Beispiel wird gezeigt, wie partitionierte DML mit dem Spanner-JDBC-Treiber ausgeführt wird.
-- 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
Eine Property vom Typ STRING
, die den aktuellen Zeitlimitwert für Anweisungen angibt.
SHOW [VARIABLE] STATEMENT_TIMEOUT
SET STATEMENT_TIMEOUT {TO|=} { '<int8>{ s | ms | us | ns }' | <int8> | DEFAULT }
Der int8
-Wert ist eine ganze Zahl, gefolgt von einem Suffix, das die Zeiteinheit angibt. DEFAULT
steht für 0 Sekunden, was einem Zeitlimit ohne Zeitlimit entspricht. Eine int8
-Zahl ohne Einheiten gibt Millisekunden an. Wenn ein Zeitüberschreitungswert festgelegt wurde, verursachen Anweisungen, die länger als das angegebene Zeitlimit dauern, einen java.sql.SQLTimeoutException
-Fehler und machen die Transaktion ungültig.
Folgende Zeiteinheiten werden unterstützt:
s
: Sekundenms
: Millisekundenus
: Mikrosekundenns
: Nanosekunden
Der Standardwert ist 0, was bedeutet, dass es kein Zeitlimit gibt.
Die Zeitüberschreitung einer Anweisung während einer Transaktion macht die Transaktion ungültig, alle nachfolgenden Anweisungen in der ungültigen Transaktion (außer ROLLBACK
) schlagen fehl und der Spanner-JDBC-Treiber löst eine java.sql.SQLTimeoutException
aus.
SPANNER.READ_ONLY_STALENESS
Eine Eigenschaft vom Typ STRING
, die die aktuelle Veralterungs-Leseeinstellung angibt, die Spanner für schreibgeschützte Transaktionen und Abfragen im AUTOCOMMIT
-Modus verwendet.
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 }' }
Der Wert für die Veralterungs-Leseeinstellung gilt für alle nachfolgenden schreibgeschützten Transaktionen und für alle Abfragen im AUTOCOMMIT
-Modus.
Der Standardwert ist STRONG
.
Die Optionen für Zeitstempelgrenzen sind folgende:
STRONG
weist Spanner an, eine stark lesen.MAX_STALENESS
definiert das Zeitintervall, das Spanner verwendet, um einen Lesevorgang von begrenzter Veralterung im Vergleich zunow()
auszuführen.MIN_READ_TIMESTAMP
definiert eine absolute Zeit, die Spanner verwendet, um perform einen Lesevorgang von begrenzter Veralterung.EXACT_STALENESS
definiert das Zeitintervall, das Spanner verwendet, um einen Lesevorgang von exakter Veralterung im Vergleich zunow()
auszuführen.READ_TIMESTAMP
definiert eine absolute Zeit, die Spanner verwendet, um einen Lesevorgang von exakter Veralterung auszuführen.
Zeitstempel müssen das folgende Format haben:
YYYY-[M]M-[D]DT[[H]H:[M]M:[S]S[.DDDDDD]][timezone]
Folgende Zeiteinheiten werden zum Festlegen der Werte MAX_STALENESS
und EXACT_STALENESS
unterstützt:
s
: Sekundenms
: Millisekundenus
: Mikrosekundenns
: Nanosekunden
Sie können den Wert dieser Eigenschaft nur ändern, wenn keine aktiven Transaktion.
▶ Beispiel: Veralterter Lesezugriff (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie Abfragen mit benutzerdefinierter Veralterung ausgeführt werden
mit dem Spanner-JDBC-Treiber.
-- 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 returns results that are up to
-- 10 seconds stale.
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
-- Read-only staleness can also be applied to read-only transactions.
-- MAX_STALENESS is 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 FirstName, LastName
FROM Singers
ORDER BY LastName;
SELECT Title, SingerId
FROM Albums
ORDER BY Title;
COMMIT;
-- Set the read staleness to an exact timestamp.
SET SPANNER.READ_ONLY_STALENESS = 'READ_TIMESTAMP 2024-01-26T10:36:00Z';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
SPANNER.OPTIMIZER_VERSION
Eine Eigenschaft vom Typ STRING
, die die Version des Optimierers angibt. Die Version ist
entweder eine Ganzzahl oder "LATEST
".
SHOW [VARIABLE] SPANNER.OPTIMIZER_VERSION
SET SPANNER.OPTIMIZER_VERSION {TO|=} { 'version'|'LATEST'|'' }
Legt die Version des Optimierungstools fest, die für alle nachfolgenden Anweisungen auf der Verbindung verwendet werden soll. Wenn die Optimierungsversion auf ''
(leerer String) festgelegt ist, gilt:
Spanner verwendet die neueste Version. Wenn keine Version des Optimierungstools festgelegt ist, verwendet Spanner die Version des Optimierungstools, die auf Datenbankebene festgelegt ist.
Der Standardwert ist ''
.
▶ Beispiel: Optimierungsversion (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie Abfragen mit einem bestimmten
Optimierer-Version mit dem Parameter
Spanner-JDBC-Treiber.
-- Set the optimizer version to 5 and execute a query.
SET SPANNER.OPTIMIZER_VERSION = '5';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
-- Execute the same query with the latest optimizer version.
SET SPANNER.OPTIMIZER_VERSION = 'LATEST';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
-- Revert back to using the default optimizer version that has been set for the
-- database.
SET SPANNER.OPTIMIZER_VERSION = '';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
SPANNER.OPTIMIZER_STATISTICS_PACKAGE
Ein Attribut vom Typ STRING
, das das aktuelle Statistikpaket für das Abfrageoptimierungstool angibt, das von dieser Verbindung verwendet wird.
SHOW [VARIABLE] SPANNER.OPTIMIZER_STATISTICS_PACKAGE
SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE {TO|=} { 'package'|'' }
Legt das Statistikpaket für das Abfrageoptimierungstool fest, das für alle nachfolgenden Anweisungen auf der Verbindung verwendet werden soll. <package>
muss ein gültiger Paketname sein. Wenn kein Optimierungstool
Statistikpaket festgelegt ist, verwendet Spanner die Optimierungsstatistiken
Paket, das auf Datenbankebene festgelegt ist.
Der Standardwert ist ''
.
▶ Beispiel: Statistikpaket für den Optimierer (zum Maximieren anklicken)
Das folgende Beispiel zeigt, wie Abfragen mit einem bestimmten
Optimierungstool Statistics-Paket mit
den Spanner-JDBC-Treiber zu installieren.
-- 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 FirstName, LastName
FROM Singers
ORDER BY LastName;
-- Execute the same query with the default optimizer statistics package.
SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE = '';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
SPANNER.RETURN_COMMIT_STATS
Eine Eigenschaft vom Typ BOOL
, die angibt, ob Statistiken zurückgegeben werden sollen für
Transaktionen über diese Verbindung. Sie können die zurückgegebenen Statistiken anzeigen, indem Sie Folgendes ausführen:
den Befehl SHOW SPANNER.COMMIT_RESPONSE
.
SHOW [VARIABLE] SPANNER.RETURN_COMMIT_STATS
SET SPANNER.RETURN_COMMIT_STATS {TO|=} { true | false }
Der Standardwert ist false
.
▶ Beispiel: Commit-Statistiken (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie Commit-Statistiken für eine Transaktion aufgerufen werden.
mit dem Spanner-JDBC-Treiber.
-- 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
Eine Eigenschaft vom Typ STRING
, die die relative Priorität für
Spanner-Anfragen. Die Priorität dient als Hinweis für den Spanner-Scheduler und garantiert nicht die Ausführungsreihenfolge.
SHOW [VARIABLE] SPANNER.RPC_PRIORITY
SET SPANNER.RPC_PRIORITY = {'HIGH'|'MEDIUM'|'LOW'|'NULL'}
'NULL'
bedeutet, dass in der Anfrage kein Hinweis enthalten sein darf.
Der Standardwert ist 'NULL'
.
Sie können auch einen Anweisungshinweis verwenden, um die RPC-Priorität anzugeben:
/*@RPC_PRIORITY=PRIORITY_LOW*/ SELECT * FROM Albums
Weitere Informationen finden Sie unter Priority
.
Tags
Mit den folgenden Anweisungen werden Anfrage- und Transaktions-Tags verwaltet.
SPANNER.STATEMENT_TAG
Eine Property vom Typ STRING
, die das Anfrage-Tag für die nächste Anweisung enthält.
SHOW [VARIABLE] SPANNER.STATEMENT_TAG
SET SPANNER.STATEMENT_TAG {TO|=} 'tag-name'
Legt das Anfrage-Tag für die nächste Anweisung fest, die ausgeführt werden soll. Nur eine
Tag kann pro Anweisung festgelegt werden. Das Tag umfasst nicht mehrere Anweisungen. sie
muss auf Anweisungsbasis festgelegt werden. Ein Anfrage-Tag kann entfernt werden, indem es
in den leeren String (''
).
Der Standardwert ist ''
.
Sie können sowohl Transaktions- als auch Kontoabrechnungs-Tags für dieselbe Kontoabrechnung festlegen.
Sie können auch einen Anweisungshinweis verwenden, um ein Anweisungs-Tag hinzuzufügen:
/*@STATEMENT_TAG='my-tag'*/ SELECT * FROM Albums
Weitere Informationen finden Sie unter Fehlerbehebung mit Anfrage- und Transaktions-Tags
▶ Beispiel: Statement-Tags (zum Maximieren klicken)
Im folgenden Beispiel wird gezeigt, wie Sie Anweisungs-Tags mit dem Spanner JDBC-Treiber festlegen.
-- Set the statement tag that should be included with the next statement.
SET SPANNER.STATEMENT_TAG = 'tag1';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
-- The statement tag property is cleared after each statement execution.
SHOW SPANNER.STATEMENT_TAG;
-- Set another tag for the next statement.
SET SPANNER.STATEMENT_TAG = 'tag2';
SELECT Title
FROM Albums
ORDER BY Title;
-- Set a statement tag with a query hint.
/*@STATEMENT_TAG='tag3'*/
SELECT TrackNumber, Title
FROM Tracks
WHERE AlbumId=1 AND SingerId=1
ORDER BY TrackNumber;
SPANNER.TRANSACTION_TAG
Eine Property vom Typ STRING
, die das Transaktions-Tag für die nächste Transaktion enthält.
SHOW [VARIABLE] SPANNER.TRANSACTION_TAG
SET SPANNER.TRANSACTION_TAG {TO|=} 'tag-name'
Legt das Transaktions-Tag für die aktuelle Transaktion fest, die ausgeführt werden soll. Pro Transaktion kann nur ein Tag festgelegt werden. Das Tag deckt nicht mehrere Transaktionen ab, sondern muss pro Transaktion festgelegt werden. Ein Transaktions-Tag kann entfernt werden, indem es auf den leeren String (''
) gesetzt wird. Das Transaktions-Tag muss festgelegt werden, bevor in der Transaktion Anweisungen ausgeführt wurden.
Der Standardwert ist ''
.
Sie können sowohl Transaktions- als auch Kontoabrechnungs-Tags für dieselbe Kontoabrechnung festlegen.
Weitere Informationen finden Sie unter Fehlerbehebung mit Anfrage- und Transaktions-Tags
▶ Beispiel: Transaktions-Tags (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie Transaktions-Tags mit der Methode
Spanner-JDBC-Treiber.
BEGIN;
-- Set the transaction tag for the current transaction.
SET SPANNER.TRANSACTION_TAG = 'transaction-tag-1';
-- Set the statement tag that should be included with the next statement.
-- The statement will include both the statement tag and the transaction tag.
SET SPANNER.STATEMENT_TAG = 'select-statement';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
-- The statement tag property is cleared after each statement execution.
SHOW SPANNER.STATEMENT_TAG;
-- Set another tag for the next statement.
SET SPANNER.STATEMENT_TAG = 'insert-statement';
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
COMMIT;
-- The transaction tag property is cleared when the transaction finishes.
SHOW SPANNER.TRANSACTION_TAG;
Transaktionsanweisungen
Die folgenden Anweisungen verwalten Spanner-Transaktionen und führen für sie ein Commit durch.
TRANSAKTIONSISOLIERUNGSSTUFE
SHOW [VARIABLE] TRANSACTION ISOLATION LEVEL
Gibt eine Ergebnismenge mit einer Zeile und einer Spalte vom Typ STRING
zurück. Zurückgegeben
Wert ist immer serializable
.
SPANNER.READ_TIMESTAMP
SHOW [VARIABLE] SPANNER.READ_TIMESTAMP
Gibt eine Ergebnismenge mit einer Zeile und einer Spalte vom Typ TIMESTAMP
zurück, die den Lesezeitstempel der letzten schreibgeschützten Transaktion enthält. Diese Anweisung gibt nur dann einen Zeitstempel zurück, wenn entweder eine schreibgeschützte Transaktion noch aktiv ist und mindestens eine Abfrage ausgeführt hat, oder unmittelbar nachdem ein Commit einer schreibgeschützten Transaktion durchgeführt und bevor eine neue Transaktion begonnen wurde. Andernfalls lautet das Ergebnis NULL
.
▶ Beispiel: Zeitstempel lesen (zum Maximieren klicken)
Im folgenden Beispiel wird gezeigt, wie Sie den Zeitstempel der letzten Lesevorgänge für einen schreibgeschützten Vorgang mit dem Spanner-JDBC-Treiber aufrufen.
-- Execute a query in autocommit mode using the default read-only staleness
-- (strong).
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
-- Show 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 FirstName, LastName
FROM Singers
ORDER BY LastName;
-- Show 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 FirstName, LastName
FROM Singers
ORDER BY LastName;
-- Show 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;
SPANNER.COMMIT_TIMESTAMP
SHOW [VARIABLE] SPANNER.COMMIT_TIMESTAMP
Gibt eine Ergebnismenge mit einer Zeile und einer Spalte vom Typ TIMESTAMP
zurück, die den Commit-Zeitstempel der letzten Lese-/Schreibtransaktion enthält, für die Spanner ein Commit durchgeführt hat. Diese Anweisung gibt nur dann einen Zeitstempel zurück,
Sie führen sie nach dem Commit einer Lese-Schreib-Transaktion und vor der Ausführung aus.
alle nachfolgenden SELECT
-, DML
- oder Schemaänderungsanweisungen. Andernfalls lautet das Ergebnis NULL
.
▶ Beispiel: Commit-Zeitstempel (zum Maximieren anklicken)
Das folgende Beispiel zeigt, wie Sie den Zeitstempel des letzten Commits für eine
Schreibvorgang mit dem Spanner-JDBC-Treiber ausführen.
-- Execute a DML statement.
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1), (2, 200, 2), (3, 300, 3);
-- Show the timestamp that the statement was committed.
SHOW SPANNER.COMMIT_TIMESTAMP;
SPANNER.COMMIT_RESPONSE
SHOW [VARIABLE] SPANNER.COMMIT_RESPONSE
Gibt eine Ergebnismenge mit einer Zeile und zwei Spalten zurück:
COMMIT_TIMESTAMP
(type=TIMESTAMP
) gibt an, wann der letzte Transaktion wurde mit Commit durchgeführt.MUTATION_COUNT
(type=INT64
) gibt an, wie viele Mutationen in der mit Commit durchgeführten Transaktion. Dieser Wert ist bei Ausführung im Emulator.
Die Mutationsanzahl ist nur verfügbar, wenn SET SPANNER.RETURN_COMMIT_STATS
vor dem Transaktionscommit auf true
gesetzt wurde.
▶ Beispiel: Commit-Antwort (zum Vergrößern anklicken)
Das folgende Beispiel zeigt, wie Sie die letzte Commit-Antwort für eine
Schreibvorgang mit dem Spanner-JDBC-Treiber ausführen.
-- Enable returning commit stats in addition to the commit timestamp.
SET SPANNER.RETURN_COMMIT_STATS = true;
-- Execute a DML statement.
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1), (2, 200, 2), (3, 300, 3);
-- Show the timestamp that the statement was committed.
SHOW SPANNER.COMMIT_RESPONSE;
{ START | BEGIN } [ TRANSAKTION | ARBEIT ]
{ START | BEGIN } [ TRANSACTION | WORK ] [{ READ ONLY | READ WRITE }]
Startet eine neue Transaktion. Die Keywords TRANSACTION
und WORK
sind optional, äquivalent und haben keine Auswirkungen.
- Verwende
COMMIT
oderROLLBACK
, um eine Transaktion zu beenden. - Wenn Sie den
AUTOCOMMIT
-Modus aktiviert haben, entfernt diese Anweisung vorübergehend die Verbindung aus demAUTOCOMMIT
-Modus. Die Verbindung kehrt in denAUTOCOMMIT
-Modus zurück, wenn die Transaktion endet. - Wenn weder
READ ONLY
nochREAD WRITE
angegeben ist, wird der Transaktionsmodus durch den Standardtransaktionsmodus der Sitzung bestimmt. Diese Standardeinstellung ist mit dem BefehlSET SESSION CHARACTERISTICS AS TRANSACTION
oder durch indem Sie die VariableREADONLY
festlegen.
Sie können diese Anweisung nur ausführen, wenn keine aktive Transaktion vorhanden ist.
▶ Beispiel: BEGIN TRANSACTION (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie Sie verschiedene Arten von Transaktionen mit dem Spanner JDBC-Treiber starten.
-- This starts a transaction using the current defaults of this connection.
-- The value of READONLY determines whether the transaction is a
-- read-write or a read-only transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
COMMIT;
-- Set READONLY to TRUE to use read-only transactions by default.
SET READONLY=TRUE;
-- This starts a read-only transaction.
BEGIN;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
COMMIT;
-- Add 'READ WRITE' or 'READ ONLY' to the 'BEGIN' command to
-- override the current default of the connection.
SET READONLY=FALSE;
BEGIN READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
COMMIT;
COMMIT [TRANSAKTION | ARBEIT]
COMMIT [ TRANSACTION | WORK ]
Führt ein Commit der aktuellen Transaktion durch. Die Keywords TRANSACTION
und WORK
sind
optional und äquivalent sind und haben keinerlei Auswirkungen.
- Durch das Commit einer Lese-/Schreibtransaktion werden alle Aktualisierungen dieser Transaktion für andere Transaktionen sichtbar und alle Sperren der Transaktion in Spanner werden aufgehoben.
- Durch das Commit einer schreibgeschützten Transaktion wird die aktuelle schreibgeschützte Transaktion beendet. Jede nachfolgende Anweisung startet eine neue Transaktion. Es gibt keinen semantischen Unterschied zwischen
COMMIT
undROLLBACK
für eine schreibgeschützte Transaktion.
Sie können diese Anweisung nur ausführen, während eine aktive Transaktion vorhanden ist.
▶ Beispiel: COMMIT TRANSACTION (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie Sie mit der Methode
Spanner-JDBC-Treiber.
-- Execute a regular read-write transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
COMMIT;
-- Execute a read-only transaction. Read-only transactions also need to be
-- either committed or rolled back in the Spanner JDBC driver in order
-- to mark the end of the transaction.
BEGIN READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
COMMIT;
{ Abbrechen | ROLLBACK } [TRANSAKTION | ARBEIT]
{ ABORT | ROLLBACK } [TRANSACTION | WORK]
Führt ein ROLLBACK
der aktuellen Transaktion durch. Die Keywords TRANSACTION
und
WORK
sind optional und äquivalent und haben keine Auswirkungen.
- Ein
ROLLBACK
einer Lese-/Schreibtransaktion löscht alle gepufferten Mutationen, führt ein Rollback der Transaktion in Spanner durch und hebt alle Sperren der Transaktion auf. - Ein
ROLLBACK
einer schreibgeschützten Transaktion beendet die aktuelle schreibgeschützte Transaktion. Jede nachfolgende Anweisung startet eine neue Transaktion. Es gibt keinen semantischen Unterschied zwischenCOMMIT
undROLLBACK
für eine schreibgeschützte Transaktion auf einer Verbindung.
Sie können diese Anweisung nur ausführen, während eine aktive Transaktion vorhanden ist.
▶ Beispiel: ROLLBACK-TRANSAKTION (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie Sie mit der Methode
Spanner-JDBC-Treiber.
-- Use ROLLBACK to undo the effects of a transaction.
BEGIN;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
-- This ensures that the insert statement is not persisted in the database.
ROLLBACK;
-- Read-only transactions also need to be either committed or rolled back in the
-- Spanner JDBC driver in order to mark the end of the transaction.
-- There is no semantic difference between rolling back or committing a
-- read-only transaction.
BEGIN READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
ROLLBACK;
SET TRANSACTION
SET TRANSACTION { READ ONLY | READ WRITE }
Legt den Transaktionsmodus für die aktuelle Transaktion fest.
Sie können diese Anweisung nur ausführen, wenn AUTOCOMMIT
= false
ist oder wenn Sie eine Transaktion durch Ausführung von BEGIN [TRANSACTION | WORK]
gestartet und noch keinerlei Anweisungen in der Transaktion ausgeführt haben.
Diese Anweisung legt den Transaktionsmodus nur für die aktuelle Transaktion fest. Wenn die Transaktion committet oder zurückgerollt wird, verwendet die nächste Transaktion den Standardmodus für die Verbindung.
(Siehe SET SESSION CHARACTERISTICS
.)
▶ Beispiel: TRANSAKTION FESTLEGEN (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie Transaktionseigenschaften mit der Methode
Spanner-JDBC-Treiber.
-- Start a transaction and set the transaction mode to read-only.
BEGIN;
SET TRANSACTION READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
-- Commit the read-only transaction to mark the end of the transaction.
COMMIT;
-- Start a transaction and set the transaction mode to read-write.
BEGIN;
SET TRANSACTION READ WRITE;
INSERT INTO T (id, col_a, col_b)
VALUES (1, 100, 1);
COMMIT;
MERKMALE DER SITZUNG FESTLEGEN
SET SESSION CHARACTERISTICS AS TRANSACTION { READ ONLY | READ WRITE }
Legt den Standardtransaktionsmodus für Transaktionen in der Sitzung auf READ ONLY
oder READ WRITE
fest. Diese Anweisung ist nur zulässig, wenn keine
aktive Transaktion.
Mit dem Befehl SET TRANSACTION
kann diese Einstellung überschrieben werden.
Batch-Anweisungen
Die folgenden Anweisungen verwalten Batches von DDL-Anweisungen und senden sie an Spanner.
START BATCH DDL
START BATCH DDL
Startet einen Batch von DDL-Anweisungen auf der Verbindung. Alle nachfolgenden Anweisungen im Batch müssen DDL-Anweisungen sein. Die DDL-Anweisungen werden lokal gepuffert und als ein Batch an Spanner gesendet, wenn Sie RUN BATCH
ausführen.
Die Ausführung mehrerer DDL-Anweisungen in einem Batch ist in der Regel schneller als die separate Ausführung der Anweisungen.
Sie können diese Anweisung nur ausführen, wenn keine aktive Transaktion vorhanden ist.
▶ Beispiel: DDL-Batch (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie ein DDL-Batch mit dem Spanner JDBC-Treiber ausgeführt wird.
-- Start a DDL batch. All following statements must be DDL statements.
START BATCH DDL;
-- This statement is buffered locally until RUN BATCH is executed.
CREATE TABLE Singers (
SingerId BIGINT NOT NULL PRIMARY KEY,
FirstName VARCHAR,
LastName VARCHAR
);
-- This statement is buffered locally until RUN BATCH is executed.
CREATE TABLE Albums (
AlbumId BIGINT NOT NULL PRIMARY KEY,
Title VARCHAR,
SingerId BIGINT,
CONSTRAINT fk_albums_singers FOREIGN KEY (SingerId) REFERENCES Singers (SingerId)
);
-- This runs the DDL statements as one batch.
RUN BATCH;
RUN BATCH
RUN BATCH
Sendet alle gepufferten DDL-Anweisungen im aktuellen DDL-Batch an die Datenbank, wartet auf die Ausführung dieser Anweisungen durch Spanner und beendet den aktuellen DDL-Batch.
Wenn Spanner nicht mindestens eine DDL-Anweisung ausführen kann, gibt RUN BATCH
einen Fehler für die erste DDL-Anweisung zurück, die von Spanner nicht ausgeführt werden kann. Andernfalls wird RUN BATCH
erfolgreich zurückgegeben.
ABORT BATCH
ABORT BATCH
Löscht alle gepufferten DDL-Anweisungen im aktuellen DDL-Batch und beendet den Batch.
Sie können diese Anweisung nur ausführen, wenn ein DDL-Batch aktiv ist. Sie können ABORT BATCH
verwenden, unabhängig davon, ob im Batch gepufferte DDL-Anweisungen vorhanden sind oder nicht. Alle vorherigen DDL-Anweisungen im Batch werden abgebrochen.
▶ Beispiel: DDL-Batch abbrechen (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie ein DDL-Batch mit dem Spanner JDBC-Treiber abgebrochen wird.
-- Start a DDL batch. All following statements must be DDL statements.
START BATCH DDL;
-- The following statements are buffered locally.
CREATE TABLE Singers (
SingerId BIGINT NOT NULL PRIMARY KEY,
FirstName VARCHAR,
LastName VARCHAR
);
-- This statement is buffered locally until RUN BATCH is executed.
CREATE TABLE Albums (
AlbumId BIGINT NOT NULL PRIMARY KEY,
Title VARCHAR,
SingerId BIGINT,
CONSTRAINT fk_albums_singers FOREIGN KEY (SingerId) REFERENCES Singers (SingerId)
);
-- This aborts the DDL batch and removes the DDL statements from the buffer.
ABORT BATCH;
BATCH-DML STARTEN und BATCH AUSFÜHREN
Mit den folgenden Anweisungen werden die beiden DML-Anweisungen zusammengefasst und in einem Aufruf an den Server gesendet. Ein DML-Batch kann als Teil einer Transaktion oder im automatischen Commit-Modus ausgeführt werden.
START BATCH DML;
INSERT INTO MYTABLE (ID, NAME) VALUES (1, 'ONE');
INSERT INTO MYTABLE (ID, NAME) VALUES (2, 'TWO');
RUN BATCH;
▶ Beispiel: DML-Batch (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie ein DML-Batch mit dem Spanner JDBC-Treiber ausgeführt wird.
-- Start a DML batch. All following statements must be a DML statement.
START BATCH DML;
-- The following statements are buffered locally.
INSERT INTO MYTABLE (ID, NAME) VALUES (1, 'ONE');
INSERT INTO MYTABLE (ID, NAME) VALUES (2, 'TWO');
-- This sends the statements to Spanner.
RUN BATCH;
-- DML batches can also be part of a read/write transaction.
BEGIN;
-- Insert a row using a single statement.
INSERT INTO MYTABLE (ID, NAME) VALUES (3, 'THREE');
-- Insert two rows using a batch.
START BATCH DML;
INSERT INTO MYTABLE (ID, NAME) VALUES (4, 'FOUR');
INSERT INTO MYTABLE (ID, NAME) VALUES (5, 'FIVE');
RUN BATCH;
-- Rollback the current transaction. This rolls back both the single DML
-- statement and the DML batch.
ROLLBACK;
Data Boost und Abfragen für partitionierte Tabellen
Die partitionQuery API unterteilt eine Abfrage in kleinere Teile oder Partitionen und verwendet mehrere Maschinen, um die Partitionen parallel abzurufen. Jede Partition wird durch ein Partitionstoken identifiziert. Die PartitionQuery API hat eine höhere Latenz als die Standard-API. Query API verwenden, da sie nur für Bulk-Vorgänge wie das Exportieren oder das Scannen der gesamten Datenbank.
Mit Data Boost können Sie Analyseabfragen und Datenexporte nahezu ohne Auswirkungen auf vorhandene Arbeitslasten auf der bereitgestellten Spanner-Instanz ausführen. Data Boost unterstützt nur partitionierte Abfragen.
Du kannst Data Boost für die aktuelle Verbindung mit der
SET SPANNER.DATA_BOOST_ENABLED
-Anweisung.
Der JDBC-Treiber unterstützt drei Alternativen zum Ausführen von partitionierten Abfragen:
SET SPANNER.AUTO_PARTITION_MODE = true
RUN PARTITIONED QUERY sql
PARTITION sql
gefolgt von mehrerenRUN PARTITION 'partition-token'
Diese Methoden werden in den folgenden Abschnitten beschrieben.
SPANNER.DATA_BOOST_ENABLED
Ein Attribut vom Typ BOOL
, das angibt, ob für diese Verbindung Data Boost für partitionierte Abfragen verwendet werden soll. Der Standardwert ist false
.
SHOW [VARIABLE] SPANNER.DATA_BOOST_ENABLED
SET SPANNER.DATA_BOOST_ENABLED {TO|=} { true | false }
Legt fest, ob für diese Verbindung Data Boost für partitionierte Abfragen.
Der Standardwert ist false
.
▶ Beispiel: Abfrage mit Data Boost ausführen (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie eine Abfrage mit Data Boost mit dem
Spanner-JDBC-Treiber.
-- Enable Data Boost on this connection.
SET SPANNER.DATA_BOOST_ENABLED = true;
-- Execute a partitioned query. Data Boost is only used for partitioned queries.
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers;
Ein vollständiges Beispiel finden Sie unter PostgreSQL DataBoostExample.
SPANNER.AUTO_PARTITION_MODE
Ein Attribut vom Typ BOOL
, das angibt, ob für die Verbindung automatisch partitionierte Abfragen für alle ausgeführten Abfragen verwendet werden.
SHOW [VARIABLE] SPANNER.AUTO_PARTITION_MODE
SET SPANNER.AUTO_PARTITION_MODE {TO|=} { true | false}
- Legen Sie diese Variable auf
true
fest, wenn für die Verbindung für alle ausgeführten Abfragen eine partitionierte Abfrage verwendet werden soll. - Setzen Sie
SPANNER.DATA_BOOST_ENABLED
auch auftrue
, wenn Sie möchten, Verbindung, um Data Boost für alle zu verwenden Abfragen.
Der Standardwert ist false
.
▶ Beispiel: Ausführen (zum Maximieren klicken)
In diesem Beispiel werden zwei Abfragen mit dem Spanner-JDBC-Treiber ausgeführt:
Daten-Boost
SET SPANNER.AUTO_PARTITION_MODE = true
SET SPANNER.DATA_BOOST_ENABLED = true
SELECT FirstName, LastName FROM Singers
SELECT SingerId, Title FROM Albums
Ein vollständiges Beispiel finden Sie unter PostgreSQL AutoPartitionModeExample.
PARTITIONIERTE ABFRAGE AUSFÜHREN
RUN PARTITIONED QUERY <sql>
Führt eine Abfrage als partitionierte Abfrage in Spanner aus. Stellen Sie sicher, dass
SPANNER.DATA_BOOST_ENABLED
ist auf true
gesetzt, um die Abfrage mit
Daten-Optimierung:
SET SPANNER.DATA_BOOST_ENABLED = true
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers
Der JDBC-Treiber partitioniert die Abfrage intern und führt Partitionen in
parallel. Die Ergebnisse werden zu einem Ergebnissatz zusammengeführt und an den
. Die Anzahl der Worker-Threads, die Partitionen ausführen, kann mit
die Variable SPANNER.MAX_PARTITIONED_PARALLELISM
.
Ein vollständiges Beispiel finden Sie unter PostgreSQL-RunPartitionedQueryExample.
PARTITION <SQL>
PARTITION <sql>
Erstellt eine Liste von Partitionen, um eine Abfrage für Spanner auszuführen, und
gibt diesen eine Liste von Partitionstokens zurück. Jedes Partitionstoken kann ausgeführt werden
über eine separate JDBC-Verbindung auf demselben oder einem anderen Host
RUN PARTITION 'partition-token'
-Befehl.
▶ Beispiel: Partitionsabfrage (zum Maximieren klicken)
Im folgenden Beispiel wird gezeigt, wie eine Abfrage partitioniert und dann jede Partition mit dem Spanner JDBC-Treiber separat ausgeführt wird.
-- Partition a query. This returns a list of partition tokens that can be
-- executed either on this connection or on any other connection to the same
-- database.
PARTITION SELECT FirstName, LastName FROM Singers;
-- Run the partitions that were returned from the previous statement.
RUN PARTITION 'partition-token-1';
RUN PARTITION 'partition-token-2';
Ein vollständiges Beispiel finden Sie unter PostgreSQL PartitionQueryExample.
RUN PARTITION "partition-token"
RUN PARTITION 'partition-token'
Führt eine Abfragepartition aus, die zuvor vom Befehl PARTITION
zurückgegeben wurde. Der Befehl kann für jede JDBC-Verbindung ausgeführt werden,
der die Partitionstoken erstellt hat.
Ein vollständiges Beispiel finden Sie unter PostgreSQL-PartitionQueryExample.
SPANNER.MAX_PARTITIONED_PARALLELISM
Ein Attribut vom Typ int8
, das die Anzahl der Worker-Threads angibt,
Der JDBC-Treiber von Spanner zum Ausführen von Partitionen. Dieser Wert wird verwendet für:
SPANNER.AUTO_PARTITION_MODE = true
RUN PARTITIONED QUERY sql
SHOW [VARIABLE] SPANNER.MAX_PARTITIONED_PARALLELISM
SET SPANNER.MAX_PARTITIONED_PARALLELISM = <int8>
Legt die maximale Anzahl von Worker-Threads fest, die der Spanner JDBC-Treiber zum Ausführen von Partitionen verwenden kann. Wenn Sie diesen Wert auf 0
festlegen, wird der Spanner JDBC-Treiber angewiesen, die Anzahl der CPU-Kerne auf dem Clientcomputer als Maximum zu verwenden.
Der Standardwert ist 0
.
Speicherpunktbefehle
Mit den folgenden Anweisungen werden emulierte
savepoints
Transaktionen. Sie können einen Speicherpunkt erstellen, indem Sie die Methode java.sql.Connection#setSavepoint()
aufrufen.
Der Spanner JDBC-Treiber emuliert Savepoints, um Frameworks zu unterstützen, die diese für verschachtelte Transaktionen benötigen. Speicherpunkte werden emuliert, indem die einer laufenden Prüfsumme für die Ergebnisse, die von Anweisungen in der Transaktion. Beim Zurückrollen zu einem Positionsmerkmal rollt der Spanner JDBC-Treiber die Transaktion zurück und versucht dann, die Transaktion bis zu dem Punkt noch einmal auszuführen, an dem der Positionsmerkmal festgelegt wurde. Die Prüfsumme der wird der Wiederholungsversuch mit der Prüfsumme der ersten Transaktion verglichen, um zu verifizieren, dass der wurden dieselben Ergebnisse zurückgegeben.
SPANNER.SAVEPOINT_SUPPORT
SHOW [VARIABLE] SPANNER.SAVEPOINT_SUPPORT
SET SPANNER.SAVEPOINT_SUPPORT {TO|=} { 'DISABLED' | 'FAIL_AFTER_ROLLBACK' | 'ENABLED' }
Eine Eigenschaft vom Typ STRING
, die den aktuellen SAVEPOINT_SUPPORT
angibt
Konfiguration. Folgende Werte sind möglich:
DISABLED
: Alle Savepoint-Befehle sind deaktiviert und schlagen fehl.FAIL_AFTER_ROLLBACK
: Befehle für den Positionsspeicher sind aktiviert. Wenn Sie zu einem Speicherpunkt zurückgehen, wird die gesamte Transaktion rückgängig gemacht. Die Transaktion schlägt fehl, wenn Sie versuchen, um die Transaktion nach dem Rollback auf einen Savepoint zu verwenden.ENABLED
: Alle Savepoint-Befehle sind aktiviert. Wenn Sie zu einem Positionsspeicherpunkt zurückrollen, wird die Transaktion rückgängig gemacht und der Vorgang wird bis zum Positionsspeicherpunkt wiederholt. Dieser Vorgang schlägt mit dem FehlerAbortedDueToConcurrentModificationException
fehl, wenn sich die zugrunde liegenden Daten, die von der Transaktion bis zum Savepoint verwendet wurden, geändert haben.
Der Standardwert ist FAIL_AFTER_ROLLBACK
.
Sie können den Wert dieser Variablen nur ändern, wenn keine aktive Transaktion vorhanden ist.
▶ Beispiel: Savepoint-Unterstützung (zum Maximieren klicken)
Das folgende Beispiel zeigt, wie die Unterstützung von Savepoints in
den Spanner-JDBC-Treiber zu installieren.
try (Connection connection =
DriverManager.getConnection(
String.format(
"jdbc:cloudspanner:/projects/%s/instances/%s/databases/%s",
"my-project", "my-instance", "my-database"))) {
// Savepoints can only be used when AutoCommit=false.
connection.setAutoCommit(false);
// Disables setting a savepoint.
connection.createStatement().execute("SET SPANNER.SAVEPOINT_SUPPORT='DISABLED'");
// The following statement fails because savepoints have been disabled.
connection.setSavepoint("my_savepoint1");
// Enables setting a savepoint and releasing a savepoint.
// Rolling back to a savepoint is disabled.
connection.createStatement().execute("SET SPANNER.SAVEPOINT_SUPPORT='FAIL_AFTER_ROLLBACK'");
Savepoint mySavepoint2 = connection.setSavepoint("my_savepoint2");
connection.createStatement().execute("insert into my_table (id, value) values (1, 'One')");
connection.releaseSavepoint(mySavepoint2);
connection.commit();
// Enables setting, releasing and rolling back to a savepoint.
connection.createStatement().execute("SET SPANNER.SAVEPOINT_SUPPORT='ENABLED'");
Savepoint mySavepoint3 = connection.setSavepoint("my_savepoint3");
connection.createStatement().execute("insert into my_table (id, value) values (2, 'Two')");
connection.rollback(mySavepoint3);
}
Nächste Schritte
JDBC mit einer PostgreSQL-Dialektdatenbank verbinden