Perintah pengelolaan sesi JDBC (GoogleSQL)

Driver JDBC (Java Database Connectivity) Spanner mendukung pernyataan pengelolaan sesi, yang memungkinkan Anda mengubah status koneksi, menjalankan transaksi, dan menjalankan batch pernyataan secara efisien.

Perintah berikut berlaku untuk database dialek GoogleSQL.

Pernyataan koneksi

Pernyataan berikut membuat perubahan pada atau menampilkan properti koneksi saat ini.

HANYA BACA

Boolean yang menunjukkan apakah koneksi dalam mode hanya baca atau tidak. Defaultnya adalah false.

SHOW VARIABLE READONLY
SET READONLY = { true | false }

Anda hanya dapat mengubah nilai properti ini jika tidak ada transaksi aktif.

▶ Contoh: Transaksi hanya baca (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menggunakan properti ini untuk menjalankan transaksi hanya baca di Spanner.

SET 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 VARIABLE READ_TIMESTAMP;

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

AUTOCOMMIT

Boolean yang menunjukkan apakah koneksi berada dalam mode commit otomatis atau tidak. Defaultnya adalah true.

SHOW VARIABLE AUTOCOMMIT
SET AUTOCOMMIT = { true | false }

Anda dapat mengubah nilai properti ini hanya jika tidak ada transaksi aktif.

Jika AUTOCOMMIT disetel ke salah (false), transaksi baru akan dimulai secara otomatis setelah Anda menjalankan COMMIT atau ROLLBACK. Pernyataan pertama yang Anda jalankan memulai transaksi.

▶ Contoh: Autocommit (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menggunakan properti autocommit.

-- The default value for AUTOCOMMIT is true.
SHOW VARIABLE 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;

RETRY_ABORTS_INTERNALLY

Nilai boolean yang menunjukkan apakah koneksi otomatis mencoba lagi transaksi yang dibatalkan. Nilai defaultnya adalah true.

SHOW VARIABLE RETRY_ABORTS_INTERNALLY
SET RETRY_ABORTS_INTERNALLY = { true | false }

Anda dapat mengubah nilai properti ini hanya setelah transaksi dimulai (lihat BEGIN TRANSACTION) dan sebelum pernyataan apa pun dieksekusi dalam transaksi.

Saat Anda menyetel RETRY_ABORTS_INTERNALLY ke benar (true), koneksi akan menyimpan checksum semua data yang dikembalikan koneksi ke aplikasi klien. ID ini digunakan untuk mencoba kembali transaksi jika dibatalkan oleh Spanner.

Nilai defaultnya adalah true. Sebaiknya tetapkan nilai ini ke false jika aplikasi Anda sudah mencoba ulang transaksi yang dibatalkan.

AUTOCOMMIT_DML_MODE

Properti STRING yang menunjukkan mode penerapan otomatis untuk pernyataan Bahasa Manipulasi Data (DML).

SHOW VARIABLE AUTOCOMMIT_DML_MODE
SET AUTOCOMMIT_DML_MODE = { 'TRANSACTIONAL' | 'PARTITIONED_NON_ATOMIC' }

Kemungkinan nilainya adalah:

  • Dalam mode TRANSACTIONAL, driver menjalankan pernyataan DML sebagai transaksi atomik terpisah. Driver membuat transaksi baru, menjalankan pernyataan DML, dan melakukan commit transaksi jika eksekusi berhasil atau me-roll back transaksi jika terjadi error.
  • Dalam mode PARTITIONED_NON_ATOMIC, driver mengeksekusi pernyataan DML sebagai pernyataan update berpartisi. Pernyataan update yang dipartisi dapat berjalan sebagai serangkaian banyak transaksi, yang masing-masing mencakup subset baris yang terpengaruh. Pernyataan yang dipartisi memberikan semantik yang lebih lemah sebagai imbalan atas skalabilitas dan performa yang lebih baik.

Nilai defaultnya adalah TRANSACTIONAL.

▶ Contoh: DML yang dipartisi (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menjalankan DML yang Dipartisi menggunakan driver JDBC Spanner.

-- Change autocommit DML mode to use Partitioned DML.
SET 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 AUTOCOMMIT_DML_MODE = 'TRANSACTIONAL';

STATEMENT_TIMEOUT

Properti jenis STRING yang menunjukkan nilai waktu tunggu saat ini untuk pernyataan.

SHOW VARIABLE STATEMENT_TIMEOUT
SET STATEMENT_TIMEOUT = { '<INT64>{ s | ms | us | ns }' | NULL }

Nilai INT64 adalah bilangan bulat yang diikuti dengan akhiran yang menunjukkan satuan waktu. Nilai NULL menunjukkan bahwa tidak ada nilai waktu tunggu yang ditetapkan. Jika nilai waktu tunggu pernyataan telah ditetapkan, pernyataan yang memerlukan waktu lebih lama dari nilai waktu tunggu yang ditentukan akan menyebabkan error java.sql.SQLTimeoutException dan membatalkan transaksi.

Satuan waktu yang didukung adalah:

  • s: detik
  • ms: milidetik
  • us: mikrodetik
  • ns: nanodetik

Defaultnya adalah NULL, yang berarti tidak ada nilai waktu tunggu yang ditetapkan.

Waktu tunggu pernyataan selama transaksi membatalkan transaksi, semua pernyataan berikutnya dalam transaksi yang dibatalkan (kecuali ROLLBACK) akan gagal, dan driver JDBC Spanner akan menampilkan java.sql.SQLTimeoutException.

READ_ONLY_STALENESS

Properti jenis STRING yang menunjukkan setelan keusangan hanya baca saat ini yang digunakan Spanner untuk transaksi dan kueri hanya baca dalam mode AUTOCOMMIT.

SHOW VARIABLE READ_ONLY_STALENESS
SET READ_ONLY_STALENESS = staleness_type

staleness_type:

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

Nilai keterlambatan hanya baca berlaku untuk semua transaksi hanya baca berikutnya dan untuk semua kueri dalam mode AUTOCOMMIT.

Nilai defaultnya adalah STRONG.

Opsi batas stempel waktu adalah sebagai berikut:

  • STRONG memberi tahu Spanner untuk melakukan bacaan kuat.
  • MAX_STALENESS menentukan interval waktu yang digunakan Spanner untuk melakukan pembacaan keusangan terbatas, relatif terhadap now().
  • MIN_READ_TIMESTAMP menentukan waktu absolut yang digunakan Spanner untuk melakukan pembacaan keusangan yang terikat.
  • EXACT_STALENESS menentukan interval waktu yang digunakan Spanner untuk melakukan pembacaan keaktualan yang tepat, relatif terhadap now().
  • READ_TIMESTAMP menentukan waktu absolut yang digunakan Spanner untuk melakukan pembacaan keusangan yang tepat.

Stempel waktu harus menggunakan format berikut:

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

Satuan waktu yang didukung untuk menyetel nilai MAX_STALENESS dan EXACT_STALENESS adalah:

  • s: detik
  • ms: milidetik
  • us: mikrodetik
  • ns: nanodetik

Anda dapat mengubah nilai properti ini hanya jika tidak ada transaksi yang aktif.

▶ Contoh: Keterlambatan hanya baca (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menjalankan kueri menggunakan nilai keusangan kustom dengan driver JDBC Spanner.

-- Set the read-only staleness to MAX_STALENESS 10 seconds.
SET 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 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 READ_ONLY_STALENESS = 'READ_TIMESTAMP 2024-01-26T10:36:00Z';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

OPTIMIZER_VERSION

Properti berjenis STRING yang menunjukkan versi pengoptimal. Versinya adalah bilangan bulat atau 'LATEST'.

SHOW VARIABLE OPTIMIZER_VERSION
SET OPTIMIZER_VERSION = { 'version'|'LATEST'|'' }

Menetapkan versi pengoptimal yang akan digunakan untuk semua pernyataan berikut pada koneksi. Jika versi pengoptimal ditetapkan ke '' (string kosong), maka Spanner akan menggunakan versi terbaru. Jika tidak ada versi pengoptimal yang ditetapkan, Spanner akan menggunakan versi pengoptimal yang ditetapkan di tingkat database.

Nilai defaultnya adalah ''.

▶ Contoh: Versi pengoptimal (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menjalankan kueri menggunakan versi pengoptimal tertentu dengan driver JDBC Spanner.

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

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- Execute the same query with the latest optimizer version.
SET 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 OPTIMIZER_VERSION = '';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

OPTIMIZER_STATISTICS_PACKAGE

Properti jenis STRING yang menunjukkan paket statistik pengoptimal saat ini yang digunakan oleh koneksi ini.

SHOW VARIABLE OPTIMIZER_STATISTICS_PACKAGE
SET OPTIMIZER_STATISTICS_PACKAGE = { 'package'|'' }

Menetapkan paket statistik pengoptimal yang akan digunakan untuk semua pernyataan berikutnya pada koneksi. <package> harus berupa nama paket yang valid. Jika tidak ada paket statistik pengoptimal yang ditetapkan, Spanner akan menggunakan paket statistik pengoptimal yang ditetapkan di tingkat database.

Nilai defaultnya adalah ''.

▶ Contoh: Paket statistik pengoptimal (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menjalankan kueri menggunakan paket statistik pengoptimal tertentu dengan driver JDBC Spanner.

-- 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 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 OPTIMIZER_STATISTICS_PACKAGE = '';

SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

RETURN_COMMIT_STATS

Properti berjenis BOOL yang menunjukkan apakah statistik harus ditampilkan untuk transaksi pada koneksi ini. Anda dapat melihat statistik yang ditampilkan dengan menjalankan perintah SHOW VARIABLE COMMIT_RESPONSE.

SHOW VARIABLE RETURN_COMMIT_STATS
SET RETURN_COMMIT_STATS = { true | false }

Nilai defaultnya adalah false.

▶ Contoh: Statistik penerapan (Klik untuk meluaskan)
Contoh berikut menunjukkan cara melihat statistik commit untuk transaksi dengan driver JDBC Spanner.

-- Enable the returning of commit stats.
SET 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 VARIABLE COMMIT_RESPONSE;

RPC_PRIORITY

Properti jenis STRING yang menunjukkan prioritas relatif untuk permintaan Spanner. Prioritas berfungsi sebagai petunjuk bagi penjadwal Spanner dan tidak menjamin urutan eksekusi.

SHOW VARIABLE RPC_PRIORITY
SET RPC_PRIORITY = {'HIGH'|'MEDIUM'|'LOW'|'NULL'}

'NULL' berarti tidak ada petunjuk yang harus disertakan dalam permintaan.

Nilai defaultnya adalah 'NULL'.

Anda juga dapat menggunakan petunjuk pernyataan untuk menentukan prioritas RPC:

@{RPC_PRIORITY=PRIORITY_LOW} SELECT * FROM Albums

Untuk informasi selengkapnya, lihat Priority.

Tag

Pernyataan berikut mengelola tag permintaan dan transaksi.

STATEMENT_TAG

Properti jenis STRING yang berisi tag permintaan untuk pernyataan berikutnya.

SHOW VARIABLE STATEMENT_TAG
SET STATEMENT_TAG = 'tag-name'

Menetapkan tag permintaan untuk pernyataan berikutnya yang akan dieksekusi. Hanya satu tag yang dapat ditetapkan per pernyataan. Tag tidak mencakup beberapa pernyataan; tag harus ditetapkan berdasarkan per pernyataan. Tag permintaan dapat dihapus dengan menyetelnya ke string kosong ('').

Nilai defaultnya adalah ''.

Anda dapat menetapkan tag transaksi dan tag pernyataan untuk pernyataan yang sama.

Anda juga dapat menggunakan petunjuk pernyataan untuk menambahkan tag pernyataan:

@{STATEMENT_TAG='my-tag'} SELECT * FROM Albums

Untuk mengetahui informasi selengkapnya, lihat Memecahkan masalah dengan tag permintaan dan tag transaksi.

▶ Contoh: Tag pernyataan (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menyetel tag pernyataan dengan driver JDBC Spanner.

-- Set the statement tag that should be included with the next statement.
SET STATEMENT_TAG = 'tag1';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- The statement tag property is cleared after each statement execution.
SHOW VARIABLE STATEMENT_TAG;
-- Set another tag for the next statement.
SET 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;

TRANSACTION_TAG

Properti jenis STRING yang berisi tag transaksi untuk transaksi berikutnya.

SHOW VARIABLE TRANSACTION_TAG
SET TRANSACTION_TAG = 'tag-name'

Menetapkan tag transaksi untuk transaksi saat ini yang akan dieksekusi. Hanya satu tag yang dapat ditetapkan per transaksi. Tag tidak mencakup beberapa transaksi; tag harus ditetapkan per transaksi. Tag transaksi dapat dihapus dengan menetapkannya ke string kosong (''). Tag transaksi harus ditetapkan sebelum pernyataan apa pun dijalankan dalam transaksi.

Nilai defaultnya adalah ''.

Anda dapat menetapkan tag transaksi dan tag pernyataan untuk pernyataan yang sama.

Untuk mengetahui informasi selengkapnya, lihat Memecahkan masalah dengan tag permintaan dan tag transaksi.

▶ Contoh: Tag transaksi (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menyetel tag transaksi dengan driver JDBC Spanner.

BEGIN;
-- Set the transaction tag for the current transaction.
SET 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 STATEMENT_TAG = 'select-statement';
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;

-- The statement tag property is cleared after each statement execution.
SHOW VARIABLE STATEMENT_TAG;

-- Set another tag for the next statement.
SET 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 VARIABLE TRANSACTION_TAG;

Pernyataan transaksi

Pernyataan berikut mengelola dan meng-commit transaksi Spanner.

READ_TIMESTAMP

SHOW VARIABLE READ_TIMESTAMP

Menampilkan set hasil dengan satu baris dan satu kolom berjenis TIMESTAMP yang berisi stempel waktu baca transaksi hanya baca terbaru. Pernyataan ini menampilkan stempel waktu hanya jika transaksi hanya baca masih aktif dan telah menjalankan setidaknya satu kueri, atau segera setelah transaksi hanya baca di-commit dan sebelum transaksi baru dimulai. Jika tidak, hasilnya adalah NULL.

▶ Contoh: Stempel waktu baca (Klik untuk meluaskan)
Contoh berikut menunjukkan cara melihat stempel waktu baca terakhir untuk operasi hanya baca dengan driver JDBC Spanner.

-- 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 VARIABLE READ_TIMESTAMP;

-- Set a non-deterministic read-only staleness and execute the same query.
SET 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 VARIABLE READ_TIMESTAMP;

-- The read timestamp of a read-only transaction can also be retrieved.
SET 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 VARIABLE 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 VARIABLE READ_TIMESTAMP;

COMMIT;

COMMIT_TIMESTAMP

SHOW VARIABLE COMMIT_TIMESTAMP

Menampilkan set hasil dengan satu baris dan satu kolom berjenis TIMESTAMP yang berisi stempel waktu commit dari transaksi baca-tulis terakhir yang di-commit Spanner. Pernyataan ini menampilkan stempel waktu hanya saat Anda mengeksekusinya setelah Anda melakukan transaksi baca-tulis dan sebelum Anda mengeksekusi pernyataan SELECT, DML, atau perubahan skema berikutnya. Jika tidak, hasilnya adalah NULL.

▶ Contoh: Stempel waktu commit (Klik untuk meluaskan)
Contoh berikut menunjukkan cara melihat stempel waktu commit terakhir untuk operasi tulis dengan driver JDBC Spanner.

-- 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 VARIABLE COMMIT_TIMESTAMP;

COMMIT_RESPONSE

SHOW VARIABLE COMMIT_RESPONSE

Menampilkan kumpulan hasil dengan satu baris dan dua kolom:

  • COMMIT_TIMESTAMP (type=TIMESTAMP) menunjukkan kapan transaksi terbaru di-commit.
  • MUTATION_COUNT (type=INT64) menunjukkan jumlah mutasi yang diterapkan dalam transaksi yang di-commit. Nilai ini selalu kosong saat dijalankan di emulator.

Jumlah mutasi hanya tersedia jika SET RETURN_COMMIT_STATS disetel ke true sebelum penerapan transaksi.

▶ Contoh: Respons penerapan (Klik untuk meluaskan)
Contoh berikut menunjukkan cara melihat respons commit terakhir untuk operasi tulis dengan driver JDBC Spanner.

-- Enable returning commit stats in addition to the commit timestamp.
SET 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 VARIABLE COMMIT_RESPONSE;

MULAI [TRANSACTION]

BEGIN [TRANSACTION]

Memulai transaksi baru. Kata kunci TRANSACTION bersifat opsional.

  • Gunakan COMMIT atau ROLLBACK untuk menghentikan transaksi.
  • Jika Anda telah mengaktifkan mode AUTOCOMMIT, pernyataan ini akan mengeluarkan koneksi dari mode AUTOCOMMIT untuk sementara. Koneksi kembali ke mode AUTOCOMMIT saat transaksi berakhir.
  • Mode transaksi ditentukan oleh setelan READONLY saat ini untuk koneksi ini. Nilai ini ditetapkan menggunakan perintah SET READONLY = {TRUE | FALSE}.
  • Mode transaksi dapat diubah dengan menjalankan SET TRANSACTION READ ONLY atau SET TRANSACTION READ WRITE secara langsung setelah menjalankan BEGIN [TRANSACTION].

Anda hanya dapat menjalankan pernyataan ini saat tidak ada transaksi aktif.

▶ Contoh: BEGIN TRANSACTION (Klik untuk meluaskan)
Contoh berikut menunjukkan cara memulai berbagai jenis transaksi dengan driver JDBC Spanner.

-- 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;

-- Execute 'SET TRANSACTION READ WRITE' or 'SET TRANSACTION READ ONLY' directly
-- after the BEGIN statement to override the current default of the connection.
SET READONLY=FALSE;
BEGIN;
SET TRANSACTION READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
COMMIT;

COMMIT [TRANSACTION]

COMMIT [TRANSACTION]

Melakukan transaksi saat ini. Kata kunci TRANSACTION bersifat opsional.

  • Melakukan transaksi baca-tulis membuat semua update transaksi ini terlihat oleh transaksi lain dan melepaskan semua kunci transaksi pada Spanner.
  • Melakukan commit transaksi hanya baca akan mengakhiri transaksi hanya baca saat ini. Pernyataan berikutnya akan memulai transaksi baru. Tidak ada perbedaan semantik antara COMMIT dan ROLLBACK untuk transaksi hanya baca.

Anda hanya dapat menjalankan pernyataan ini saat ada transaksi aktif.

▶ Contoh: COMMIT TRANSACTION (Klik untuk meluaskan)
Contoh berikut menunjukkan cara melakukan transaksi dengan driver JDBC Spanner.

-- 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;
SET TRANSACTION READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
COMMIT;

ROLLBACK [TRANSACTION]

ROLLBACK [TRANSACTION]

Melakukan ROLLBACK transaksi saat ini. Kata kunci TRANSACTION bersifat opsional.

  • Melakukan ROLLBACK transaksi baca-tulis akan menghapus mutasi yang di-buffer, me-roll back transaksi di Spanner, dan melepaskan kunci yang dipegang transaksi.
  • Melakukan ROLLBACK transaksi hanya baca akan mengakhiri transaksi hanya baca saat ini. Pernyataan berikutnya akan memulai transaksi baru. Tidak ada perbedaan semantik antara COMMIT dan ROLLBACK untuk transaksi hanya baca pada koneksi.

Anda hanya dapat menjalankan pernyataan ini saat ada transaksi aktif.

▶ Contoh: ROLLBACK TRANSACTION (Klik untuk meluaskan)
Contoh berikut menunjukkan cara me-rollback transaksi dengan driver JDBC Spanner.

-- 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;
SET TRANSACTION READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
ROLLBACK;

ATUR TRANSAKSI

SET TRANSACTION { READ ONLY | READ WRITE }

Menetapkan mode transaksi untuk transaksi saat ini.

Anda dapat mengeksekusi pernyataan ini hanya jika AUTOCOMMIT adalah false, atau jika Anda telah memulai transaksi dengan mengeksekusi BEGIN [TRANSACTION] dan belum mengeksekusi pernyataan apa pun dalam transaksi.

Pernyataan ini menetapkan mode transaksi hanya untuk transaksi saat ini. Saat transaksi di-commit atau di-roll back, transaksi berikutnya akan menggunakan mode default untuk koneksi (lihat SET READONLY).

▶ Contoh: SET TRANSACTION (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menyetel karakteristik transaksi dengan driver JDBC Spanner.

-- 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;

Pernyataan batch

Pernyataan berikut mengelola batch pernyataan DDL dan mengirimkan batch tersebut ke Spanner.

MULAI BATCH DDL

START BATCH DDL

Memulai batch pernyataan DDL pada koneksi. Semua pernyataan berikutnya selama batch harus berupa pernyataan DDL. Pernyataan DDL di-buffer secara lokal dan dikirim ke Spanner sebagai satu batch saat Anda menjalankan RUN BATCH. Menjalankan beberapa pernyataan DDL sebagai satu batch biasanya lebih cepat daripada menjalankan pernyataan secara terpisah.

Anda hanya dapat menjalankan pernyataan ini saat tidak ada transaksi aktif.

▶ Contoh: Batch DDL (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menjalankan batch DDL dengan driver JDBC Spanner.

-- 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  INT64 NOT NULL,
  FirstName STRING(MAX),
  LastName  STRING(MAX)
) PRIMARY KEY (SingerId);

-- This statement is buffered locally until RUN BATCH is executed.
CREATE TABLE Albums (
  AlbumId  INT64 NOT NULL,
  Title    STRING(MAX),
  SingerId INT64,
  CONSTRAINT fk_albums_singers FOREIGN KEY (SingerId) REFERENCES Singers (SingerId)
) PRIMARY KEY (AlbumId);

-- This runs the DDL statements as one batch.
RUN BATCH;

JALANKAN BATCH

RUN BATCH

Mengirim semua pernyataan DDL yang di-buffer dalam batch DDL saat ini ke database, menunggu Spanner mengeksekusi pernyataan ini, dan mengakhiri batch DDL saat ini.

Jika Spanner tidak dapat mengeksekusi setidaknya satu pernyataan DDL, RUN BATCH akan menampilkan error untuk pernyataan DDL pertama yang tidak dapat dieksekusi oleh Spanner. Jika tidak, RUN BATCH akan berhasil ditampilkan.

BATALKAN BATCH [TRANSACTION]

Menghapus semua pernyataan DDL yang di-buffer dalam batch DDL saat ini dan mengakhiri batch.

Anda hanya dapat menjalankan pernyataan ini saat batch DDL aktif. Anda dapat menggunakan ABORT BATCH terlepas dari apakah batch telah menyimpan pernyataan DDL atau tidak. Semua pernyataan DDL sebelumnya dalam batch akan dibatalkan.

▶ Contoh: Batalkan batch DDL (Klik untuk meluaskan)
Contoh berikut menunjukkan cara membatalkan batch DDL dengan driver JDBC Spanner.

-- Start a DDL batch. All following statements must be DDL statements.
START BATCH DDL;

-- The following statements are buffered locally.
CREATE TABLE Singers (
  SingerId  INT64 NOT NULL,
  FirstName STRING(MAX),
  LastName  STRING(MAX)
) PRIMARY KEY (SingerId);

CREATE TABLE Albums (
  AlbumId  INT64 NOT NULL,
  Title    STRING(MAX),
  SingerId INT64,
  CONSTRAINT fk_albums_singers FOREIGN KEY (SingerId) REFERENCES Singers (SingerId)
) PRIMARY KEY (AlbumId);

-- This aborts the DDL batch and removes the DDL statements from the buffer.
ABORT BATCH;

MULAIKAN DML BATCH dan JALANKAN Batch

Pernyataan berikut mengelompokkan dua pernyataan DML dan mengirimkannya dalam satu panggilan ke server. Batch DML dapat dieksekusi sebagai bagian dari transaksi atau dalam mode commit otomatis.

START BATCH DML;
INSERT INTO MYTABLE (ID, NAME) VALUES (1, 'ONE');
INSERT INTO MYTABLE (ID, NAME) VALUES (2, 'TWO');
RUN BATCH;

▶ Contoh: Batch DML (Klik untuk meluaskan)
Contoh berikut menunjukkan cara menjalankan batch DML dengan driver JDBC Spanner.

-- 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 dan pernyataan kueri berpartisi

partitionQuery API membagi kueri menjadi bagian-bagian yang lebih kecil, atau partisi, dan menggunakan beberapa mesin untuk mengambil partisi secara paralel. Setiap partisi diidentifikasi dengan token partisi. PartitionQuery API memiliki latensi yang lebih tinggi daripada query API standar, karena hanya ditujukan untuk operasi massal seperti mengekspor atau memindai seluruh database.

Data Boost memungkinkan Anda menjalankan kueri analisis dan ekspor data dengan dampak yang hampir tidak ada terhadap workload yang ada di instance Spanner yang disediakan. Peningkatan Data hanya mendukung kueri yang dipartisi.

Anda dapat mengaktifkan Data Boost dengan pernyataan SET DATA_BOOST_ENABLED.

Driver JDBC Spanner mendukung tiga alternatif untuk menjalankan kueri yang dipartisi:

  • SET AUTO_PARTITION_MODE = true
  • RUN PARTITIONED QUERY sql
  • PARTITION sql diikuti oleh beberapa RUN PARTITION 'partition-token'

Setiap metode ini dijelaskan di bagian berikut.

DATA_BOOST_ENABLED

Properti jenis BOOL yang menunjukkan apakah koneksi ini harus menggunakan Data Boost untuk kueri yang dipartisi. Defaultnya adalah false.

SHOW VARIABLE DATA_BOOST_ENABLED
SET DATA_BOOST_ENABLED = { true | false }

▶ Contoh: Menjalankan kueri menggunakan Data Boost (Klik untuk meluaskan)
Contoh berikut menunjukkan cara membuat kueri menggunakan Data Boost dengan driver JDBC Spanner.

-- Enable Data Boost on this connection.
SET DATA_BOOST_ENABLED = true;

-- Execute a partitioned query. Data Boost is only used for partitioned queries.
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers;

Untuk contoh lengkap, lihat DataBoostExample.

AUTO_PARTITION_MODE

Properti jenis BOOL yang menunjukkan apakah koneksi otomatis menggunakan kueri yang dipartisi untuk semua kueri yang dijalankan.

SHOW VARIABLE AUTO_PARTITION_MODE
SET AUTO_PARTITION_MODE = { true | false}
  • Tetapkan variabel ini ke true jika Anda ingin koneksi menggunakan kueri yang dipartisi untuk semua kueri yang dijalankan.
  • Tetapkan juga DATA_BOOST_ENABLED ke true jika Anda ingin koneksi menggunakan Data Boost untuk semua kueri.

Nilai defaultnya adalah false.

▶ Contoh: Eksekusi (Klik untuk meluaskan)
Contoh ini menjalankan dua kueri dengan driver JDBC Spanner menggunakan Data Boost

SET AUTO_PARTITION_MODE = true
SET DATA_BOOST_ENABLED = true
SELECT FirstName, LastName FROM Singers
SELECT SingerId, Title FROM Albums

Untuk contoh lengkap, lihat AutoPartitionModeExample.

JALANKAN KUERI YANG DIPARTISI

RUN PARTITIONED QUERY <sql>

Menjalankan kueri sebagai kueri yang dipartisi di Spanner. Pastikan DATA_BOOST_ENABLED ditetapkan ke true untuk menjalankan kueri dengan Data Boost:

SET DATA_BOOST_ENABLED = true
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers

Driver JDBC Spanner secara internal mempartisi kueri dan mengeksekusi partisi secara paralel. Hasilnya digabungkan menjadi satu set hasil dan ditampilkan ke aplikasi. Jumlah thread pekerja yang menjalankan partisi dapat ditetapkan dengan variabel MAX_PARTITIONED_PARALLELISM.

Untuk contoh lengkap, lihat RunPartitionedQueryExample.

PARTISI <SQL>

PARTITION <sql>

Membuat daftar partisi untuk menjalankan kueri terhadap Spanner dan menampilkan daftar token partisi ini. Setiap token partisi dapat dieksekusi pada koneksi terpisah di klien yang sama atau klien lain menggunakan perintah RUN PARTITION 'partition-token'.

▶ Contoh: Kueri partisi (Klik untuk meluaskan)
Contoh berikut menunjukkan cara memartisi kueri, lalu menjalankan setiap partisi secara terpisah menggunakan driver JDBC Spanner.

-- 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';

Untuk contoh lengkapnya, lihat PartitionQueryExample.

JALANKAN PARTISI 'partition-token'

RUN PARTITION 'partition-token'

Mengeksekusi partisi kueri yang sebelumnya ditampilkan oleh perintah PARTITION. Perintah dapat dijalankan pada koneksi apa pun yang terhubung ke database yang sama dengan database yang membuat token partisi.

MAX_PARTITIONED_PARALLELISM

Properti jenis INT64 yang menunjukkan jumlah thread pekerja yang digunakan driver JDBC Spanner untuk mengeksekusi partisi. Nilai ini digunakan untuk:

  • AUTO_PARTITION_MODE = true
  • RUN PARTITIONED QUERY sql
SHOW VARIABLE MAX_PARTITIONED_PARALLELISM
SET MAX_PARTITIONED_PARALLELISM = <INT64>

Menetapkan jumlah maksimum thread pekerja yang dapat digunakan driver JDBC Spanner untuk mengeksekusi partisi. Menetapkan nilai ini ke 0 akan menginstruksikan driver JDBC Spanner untuk menggunakan jumlah core CPU di mesin klien sebagai maksimum.

Nilai defaultnya adalah 0.

Pernyataan pembacaan terarah

Properti jenis STRING yang menetapkan opsi baca terarah untuk pernyataan berikut.

SHOW VARIABLE DIRECTED_READ
SET DIRECTED_READ='{"includeReplicas":{"replicaSelections":[{"location":"<location-name>"}]}}'

Untuk mengetahui informasi selengkapnya, lihat Bacaan terarah.

Perintah titik penyimpanan

Pernyataan berikut mengaktifkan dan menonaktifkan titik penyimpanan yang di-emulasi dalam transaksi. Anda dapat membuat titik penyimpanan dengan memanggil metode java.sql.Connection#setSavepoint().

Driver JDBC Spanner mengemulasi titik penyimpanan untuk mendukung framework yang mengandalkan titik penyimpanan ini untuk transaksi bertingkat. Titik penyimpanan diemulasi dengan melacak checksum yang sedang berjalan untuk hasil yang telah ditampilkan oleh pernyataan dalam transaksi. Saat melakukan roll back ke titik penyimpanan, driver JDBC Spanner akan melakukan roll back transaksi, lalu mencoba lagi transaksi hingga titik tempat titik penyimpanan ditetapkan. Checksum percobaan ulang dibandingkan dengan checksum transaksi awal untuk memverifikasi bahwa hasil yang sama ditampilkan.

SAVEPOINT_SUPPORT

SHOW VARIABLE SAVEPOINT_SUPPORT
SET SAVEPOINT_SUPPORT = { 'DISABLED' | 'FAIL_AFTER_ROLLBACK' | 'ENABLED' }

Properti jenis STRING yang menunjukkan konfigurasi SAVEPOINT_SUPPORT saat ini. Nilainya dapat berupa:

  • DISABLED: Semua perintah titik penyimpanan dinonaktifkan dan akan gagal.
  • FAIL_AFTER_ROLLBACK: Perintah savepoint diaktifkan. Melakukan roll back ke titik penyimpanan akan me-roll back seluruh transaksi. Transaksi akan gagal jika Anda mencoba menggunakan transaksi setelah melakukan rollback ke titik penyimpanan.
  • ENABLED: Semua perintah titik penyimpanan diaktifkan. Melakukan rollback ke titik penyimpanan akan me-roll back transaksi dan percobaan ulang dilakukan ke titik penyimpanan. Operasi ini akan gagal dengan error AbortedDueToConcurrentModificationException jika data pokok yang telah digunakan oleh transaksi hingga titik penyimpanan telah berubah.

Nilai defaultnya adalah FAIL_AFTER_ROLLBACK.

Anda dapat mengubah nilai variabel ini hanya jika tidak ada transaksi aktif.

▶ Contoh: Dukungan titik penyimpanan (Klik untuk meluaskan)
Contoh berikut menunjukkan cara mengaktifkan dan menonaktifkan dukungan titik penyimpanan di driver JDBC Spanner.

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 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 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 SAVEPOINT_SUPPORT='ENABLED'");
  Savepoint mySavepoint3 = connection.setSavepoint("my_savepoint3");
  connection.createStatement().execute("insert into my_table (id, value) values (2, 'Two')");
  connection.rollback(mySavepoint3);
}

Langkah berikutnya

Pelajari cara menghubungkan JDBC ke database dialek GoogleSQL.