JDBC 세션 관리 명령어(GoogleSQL)

Spanner JDBC 드라이버(Java 데이터베이스 연결)는 세션 관리 문을 지원하므로 연결 상태를 수정하고 트랜잭션을 실행하며 문의 배치를 효율적으로 실행할 수 있습니다.

다음 명령어는 GoogleSQL 언어 데이터베이스에 적용됩니다.

연결 문

다음 문은 현재 연결의 속성을 변경하거나 표시합니다.

READONLY

연결이 읽기 전용 모드인지 여부를 나타내는 불리언입니다. 기본값은 false입니다.

SHOW VARIABLE READONLY
SET READONLY = { true | false }

활성 트랜잭션이 없는 경우에만 이 속성 값을 변경할 수 있습니다.

▶ 예: 읽기 전용 트랜잭션(확대하려면 클릭)
다음 예시에서는 이 속성을 사용하여 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

연결이 자동 커밋 모드인지 여부를 나타내는 불리언입니다. 기본값은 true입니다.

SHOW VARIABLE AUTOCOMMIT
SET AUTOCOMMIT = { true | false }

활성 트랜잭션이 없는 경우에만 이 속성 값을 변경할 수 있습니다.

AUTOCOMMIT이 false로 설정되면 COMMIT 또는 ROLLBACK을 실행한 후 새 트랜잭션이 자동으로 시작됩니다. 가장 먼저 실행하는 문에서 트랜잭션이 시작됩니다.

▶ 예: 자동 커밋(확대하려면 클릭)
다음 예시에서는 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 = 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;

RETRY_ABORTS_INTERNALLY

연결이 취소된 트랜잭션을 자동으로 재시도하는지 여부를 나타내는 불리언입니다. 기본값은 true입니다.

SHOW VARIABLE RETRY_ABORTS_INTERNALLY
SET RETRY_ABORTS_INTERNALLY = { true | false }

이 속성의 값은 트랜잭션이 시작된 후(BEGIN TRANSACTION 참조)와 트랜잭션 내에서 문이 실행되기 전에만 변경할 수 있습니다.

RETRY_ABORTS_INTERNALLY를 true로 설정하면 연결이 클라이언트 애플리케이션에 반환하는 모든 데이터의 체크섬을 유지합니다. 이는 트랜잭션이 Spanner에 의해 중단된 경우 다시 시도하는 데 사용됩니다.

기본값은 true입니다. 애플리케이션에서 이미 취소된 트랜잭션을 재시도하는 경우 이 값을 false로 설정하는 것이 좋습니다.

AUTOCOMMIT_DML_MODE

DML(데이터 조작 언어) 문에 대한 자동 커밋 모드를 나타내는 STRING 속성입니다.

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

사용할 수 있는 값은 다음과 같습니다.

  • TRANSACTIONAL 모드에서 드라이버는 별도의 원자적 트랜잭션으로 DML 문을 실행합니다. 드라이버는 새 트랜잭션을 생성하고 DML 문을 실행하며 성공적인 실행 시 트랜잭션을 커밋하거나 오류가 발생한 경우 트랜잭션을 롤백합니다.
  • PARTITIONED_NON_ATOMIC 모드에서 드라이버는 파티션을 나눈 업데이트 문으로 DML 문을 실행합니다. 파티션을 나눈 업데이트 문은 각각 영향을 받는 하위 집합을 다루는 일련의 여러 트랜잭션으로 실행할 수 있습니다. 파티션을 나눈 문에서는 확장성 및 성능이 향상될 수 있도록 약화된 시맨틱스를 제공합니다.

기본값은 TRANSACTIONAL입니다.

▶ 예: Partitioned DML(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버를 사용하여 Partitioned DML을 실행하는 방법을 보여줍니다.

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

문에 대한 현재 제한 시간 값을 나타내는 STRING 유형의 속성입니다.

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

INT64 값은 시간 단위를 나타내는 서픽스가 뒤에 오는 정수입니다. NULL의 값은 제한 시간 값이 설정되지 않았음을 나타냅니다. 문 제한 시간 값이 설정되어 있는 경우 문이 지정된 제한 시간 값보다 오래 걸리면 java.sql.SQLTimeoutException 오류를 발생시키고 트랜잭션을 무효화합니다.

지원되는 시간 단위는 다음과 같습니다.

  • s: 초
  • ms: 밀리초
  • us: 마이크로초
  • ns: 나노초

기본값은 NULL이며, 제한 시간 값이 설정되지 않습니다.

트랜잭션 동안 문 제한 시간은 트랜잭션을 무효화하고 무효화된 트랜잭션(ROLLBACK 예외)의 모든 후속 문은 실패하고 Spanner JDBC 드라이버가 java.sql.SQLTimeoutException을 처리합니다.

READ_ONLY_STALENESS

Spanner가 AUTOCOMMIT 모드에서 읽기 전용 트랜잭션과 쿼리에 사용하는 현재 읽기 전용 비활성 설정을 나타내는 STRING 유형의 속성입니다.

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

읽기 전용 비활성 값은 모든 후속 읽기 전용 트랜잭션과 AUTOCOMMIT 모드의 모든 쿼리에 적용됩니다.

기본값은 STRONG입니다.

타임스탬프 경계 옵션은 다음과 같습니다.

  • STRONG은 Spanner에게 강력 읽기를 수행하라고 지시합니다.
  • MAX_STALENESS는 Spanner가 now()를 기준으로 제한된 비활성 읽기를 수행하는 데 사용하는 시간 간격을 정의합니다.
  • MIN_READ_TIMESTAMP는 Spanner가 제한된 비활성 읽기를 수행하는 데 사용하는 절대 시간을 정의합니다.
  • EXACT_STALENESS는 Spanner가 now()를 기준으로 완전 비활성 읽기를 수행하는 데 사용하는 시간 간격을 정의합니다.
  • READ_TIMESTAMP는 Spanner가 완전 비활성 읽기를 수행하는 데 사용하는 절대 시간을 정의합니다.

타임스탬프는 다음 형식을 사용해야 합니다.

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

MAX_STALENESSEXACT_STALENESS 값 설정에 지원되는 시간 단위는 다음과 같습니다.

  • s: 초
  • ms: 밀리초
  • us: 마이크로초
  • ns: 나노초

활성 트랜잭션이 없는 경우에만 이 속성 값을 수정할 수 있습니다.

▶ 예: 읽기 전용 비활성(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버에서 커스텀 비활성 값을 사용하여 쿼리를 실행하는 방법을 보여줍니다.

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

최적화 도구 버전을 나타내는 STRING 유형의 속성입니다. 버전은 정수 또는 'LATEST'입니다.

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

연결에서 다음 문에 사용할 최적화 도구 버전을 설정합니다. 최적화 도구 버전이 ''(빈 문자열)로 설정된 경우 Spanner가 최신 버전을 사용합니다. 최적화 도구 버전이 설정되지 않으면 Spanner가 데이터베이스 수준에서 설정된 최적화 도구 버전을 사용합니다.

기본값은 ''입니다.

▶ 예: 최적화 도구 버전(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버와 함께 특정 최적화 도구 버전을 사용하여 쿼리를 실행하는 방법을 보여줍니다.

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

이 연결에서 사용되는 현재 최적화 도구 통계 패키지를 나타내는 STRING 유형의 속성입니다.

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

연결의 다음 모든 문에 사용할 최적화 도구 통계 패키지를 설정합니다. <package>는 유효한 패키지 이름이어야 합니다. 최적화 도구 통계 패키지가 설정되지 않으면 Spanner가 데이터베이스 수준에서 설정된 최적화 도구 통계 패키지를 사용합니다.

기본값은 ''입니다.

▶ 최적화 도구 통계 패키지(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버와 함께 특정 최적화 도구 통계 패키지를 사용하여 쿼리를 실행하는 방법을 보여줍니다.

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

이 연결의 트랜잭션에 대한 통계를 반환해야 하는지 여부를 나타내는 BOOL 유형의 속성입니다. SHOW VARIABLE COMMIT_RESPONSE 명령어를 실행하면 반환된 통계를 볼 수 있습니다.

SHOW VARIABLE RETURN_COMMIT_STATS
SET RETURN_COMMIT_STATS = { true | false }

기본값은 false입니다.

▶ 예: 커밋 통계(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 트랜잭션의 커밋 통계를 보는 방법을 보여줍니다.

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

Spanner 요청에 대한 상대적 우선순위를 나타내는 STRING 유형의 속성입니다. 이 우선순위가 Spanner 스케줄러에 대한 힌트 역할을 하지만 실행 순서를 보장하지는 않습니다.

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

'NULL'은 요청에 힌트가 포함되지 않아야 함을 의미합니다.

기본값은 'NULL'입니다.

또한 문 힌트를 사용하여 RPC 우선순위를 지정할 수 있습니다.

@{RPC_PRIORITY=PRIORITY_LOW} SELECT * FROM Albums

자세한 내용은 Priority를 참조하세요.

태그

다음 문은 요청 및 트랜잭션 태그를 관리합니다.

STATEMENT_TAG

다음 문의 요청 태그가 포함된 STRING 유형의 속성입니다.

SHOW VARIABLE STATEMENT_TAG
SET STATEMENT_TAG = 'tag-name'

다음에 실행할 문의 요청 태그를 설정합니다. 문 하나에 태그 하나만 설정할 수 있습니다. 태그는 여러 문을 포괄하지 않으며 문 단위로 설정해야 합니다. 요청 태그를 빈 문자열('')로 설정하여 삭제할 수 있습니다.

기본값은 ''입니다.

동일한 문에 대한 트랜잭션 태그와 문 태그를 모두 설정할 수 있습니다.

또한 문 힌트를 사용하여 문 태그를 추가할 수 있습니다.

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

자세한 내용은 요청 태그 및 트랜잭션 태그를 사용한 문제 해결을 참조하세요.

▶ 예: 문 태그(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 문 태그를 설정하는 방법을 보여줍니다.

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

다음 트랜잭션에 대한 트랜잭션 태그가 포함된 STRING 유형의 속성입니다.

SHOW VARIABLE TRANSACTION_TAG
SET TRANSACTION_TAG = 'tag-name'

실행할 트랜잭션의 트랜잭션 태그를 설정합니다. 트랜잭션 하나에 태그 하나만 설정할 수 있습니다. 태그는 여러 트랜잭션을 포괄하지 않으며 트랜잭션 단위로 설정해야 합니다. 트랜잭션 태그를 빈 문자열('')로 설정하여 삭제할 수 있습니다. 트랜잭션 태그는 트랜잭션에서 문이 실행되기 전에 설정해야 합니다.

기본값은 ''입니다.

동일한 문에 대한 트랜잭션 태그와 문 태그를 모두 설정할 수 있습니다.

자세한 내용은 요청 태그 및 트랜잭션 태그를 사용한 문제 해결을 참조하세요.

▶ 예: 트랜잭션 태그(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 트랜잭션 태그를 설정하는 방법을 보여줍니다.

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;

트랜잭션 문

다음 문은 Spanner 트랜잭션을 관리하고 커밋합니다.

READ_TIMESTAMP

SHOW VARIABLE READ_TIMESTAMP

가장 최근의 읽기 전용 트랜잭션의 읽기 타임스탬프를 포함하는 TIMESTAMP 유형의 행 1개와 열 1개로 결과 조합을 반환합니다. 이 문은 읽기 전용 트랜잭션이 아직 활성 상태이고 하나 이상의 쿼리를 실행한 경우 또는 읽기 전용 트랜잭션이 커밋된 직후 및 새 트랜잭션이 시작되기 전에만 타임스탬프를 반환합니다. 그렇지 않은 경우 결과는 NULL입니다.

▶ 예: 타임스탬프 읽기(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버를 사용하는 읽기 전용 작업의 마지막 읽기 타임스탬프를 보는 방법을 보여줍니다.

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

Spanner가 커밋한 마지막 읽기-쓰기 트랜잭션의 커밋 타임스탬프를 포함하는 TIMESTAMP 유형의 행 1개와 열 1개로 결과 조합을 반환합니다. 이 문은 읽기-쓰기 트랜잭션을 커밋한 후와 이후 SELECT, DML 또는 스키마 변경 문을 실행하기 전에만 타임스탬프를 반환합니다. 그렇지 않은 경우 결과는 NULL입니다.

▶ 예: 커밋 타임스탬프(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버를 사용한 쓰기 작업의 마지막 커밋 타임스탬프를 보는 방법을 보여줍니다.

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

행 1개와 열 2개로 결과 집합을 반환합니다.

  • COMMIT_TIMESTAMP(유형=TIMESTAMP)는 가장 최근의 트랜잭션이 커밋된 시기를 나타냅니다.
  • MUTATION_COUNT(유형=INT64)는 커밋된 트랜잭션에 적용된 변형 개수를 나타냅니다. 이 값은 에뮬레이터에서 실행될 때 항상 비어 있습니다.

변형 수는 트랜잭션 커밋 전에 SET RETURN_COMMIT_STATStrue로 설정된 경우에만 제공됩니다.

▶ 예: 커밋 응답(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버를 사용하여 쓰기 작업의 마지막 커밋 응답을 보는 방법을 보여줍니다.

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

[트랜잭션] 시작

BEGIN [TRANSACTION]

새 트랜잭션을 시작합니다. TRANSACTION 키워드는 선택사항입니다.

  • COMMIT 또는 ROLLBACK을 사용하여 트랜잭션을 종료합니다.
  • AUTOCOMMIT 모드를 사용 설정한 경우 이 문은 일시적으로 AUTOCOMMIT 모드에서 연결을 해제합니다. 트랜잭션이 종료되면 이 연결은 AUTOCOMMIT 모드로 돌아갑니다.
  • 트랜잭션 모드는 이 연결의 현재 READONLY 설정에 따라 결정됩니다. 이 값은 SET READONLY = {TRUE | FALSE} 명령어를 사용해서 설정됩니다.
  • BEGIN [TRANSACTION]을 실행한 후 직접 SET TRANSACTION READ ONLY 또는 SET TRANSACTION READ WRITE를 실행하면 트랜잭션 모드를 변경할 수 있습니다.

활성 트랜잭션이 없는 경우에만 이 문을 실행할 수 있습니다.

▶ 예: 트랜잭션 시작(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 다양한 유형의 트랜잭션을 시작하는 방법을 보여줍니다.

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

현재 트랜잭션을 커밋합니다. TRANSACTION 키워드는 선택사항입니다.

  • 읽기-쓰기 트랜잭션을 커밋하면 이 트랜잭션의 모든 업데이트가 다른 트랜잭션에 표시되고 Spanner에서 트랜잭션의 모든 잠금이 해제됩니다.
  • 읽기 전용 트랜잭션을 커밋하면 현재 읽기 전용 트랜잭션이 종료됩니다. 이후 문은 새 트랜잭션을 시작합니다. 읽기 전용 트랜잭션의 경우 COMMITROLLBACK 간의 의미적 차이가 없습니다.

활성 트랜잭션이 있는 경우에만 이 문을 실행할 수 있습니다.

▶ 예: 트랜잭션 커밋(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 트랜잭션을 커밋하는 방법을 보여줍니다.

-- 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 키워드는 선택사항입니다.

  • 읽기 전용 트랜잭션의 ROLLBACK을 수행하면 버퍼링된 변형이 삭제되고 Spanner에 트랜잭션이 롤백되고 트랜잭션에 있는 모든 잠금이 해제됩니다.
  • 읽기 전용 트랜잭션의 ROLLBACK을 수행하면 현재 읽기 전용 트랜잭션을 종료합니다. 이후 모든 문은 새 트랜잭션을 시작합니다. 연결에 대한 읽기 전용 트랜잭션의 경우 COMMITROLLBACK 간의 의미적 차이가 없습니다.

활성 트랜잭션이 있는 경우에만 이 문을 실행할 수 있습니다.

▶ 예: 트랜잭션 롤백(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 트랜잭션을 롤백하는 방법을 보여줍니다.

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

트랜잭션 설정

SET TRANSACTION { READ ONLY | READ WRITE }

현재 트랜잭션의 트랜잭션 모드를 설정합니다.

AUTOCOMMITfalse이거나 BEGIN [TRANSACTION]을 실행하여 트랜잭션을 시작했지만 트랜잭션에서 아직 어떤 문도 실행하지 않은 경우에만 이 문을 실행할 수 있습니다.

이 문은 현재 트랜잭션에 대해서만 트랜잭션 모드를 설정합니다. 트랜잭션이 커밋되거나 롤백되면 다음 트랜잭션이 연결에 기본 모드를 사용합니다(SET READONLY 참조).

▶ 예: 트랜잭션 설정(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 트랜잭션 특성을 설정하는 방법을 보여줍니다.

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

일괄 문

다음 문은 일괄 DDL 문을 관리하고 해당 일괄 문을 Spanner로 전송합니다.

일괄 DDL 시작

START BATCH DDL

연결에서 일괄 DDL 문을 시작합니다. 일괄 처리되는 동안 모든 후속 문은 DDL 문이어야 합니다. DDL 문은 로컬에서 버퍼링되며 RUN BATCH 실행 시 하나의 일괄 처리로 Spanner에 전송됩니다. 여러 개의 DDL 문을 하나의 일괄 처리로 실행하는 것은 문을 개별적으로 실행하는 것보다 일반적으로 빠릅니다.

활성 트랜잭션이 없는 경우에만 이 문을 실행할 수 있습니다.

▶ 예: DDL 일괄 처리(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 DDL 일괄 처리를 실행하는 방법을 보여줍니다.

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

일괄 실행

RUN BATCH

현재 DDL 일괄 처리의 버퍼링된 DDL 문을 모두 데이터베이스로 전송하고 Spanner에서 이러한 문이 실행되기를 기다린 다음 현재 DDL 일괄 처리를 종료합니다.

Spanner에서 하나 이상의 DDL 문을 실행할 수 없는 경우 RUN BATCH는 Spanner가 실행할 수 없는 첫 번째 DDL 문에 대한 오류를 반환합니다. 그렇지 않은 경우 RUN BATCH를 반환합니다.

일괄 처리 취소 [트랜잭션]

현재 DDL 일괄 처리에서 버퍼링된 DDL 문을 모두 지우고 일괄 처리를 종료합니다.

DDL 일괄 처리가 활성화된 경우에만 이 문을 실행할 수 있습니다. 일괄 처리가 DDL 문을 버퍼링했는지 여부와 상관없이 ABORT BATCH를 사용할 수 있습니다. 일괄 처리에서 이전의 모든 DDL 문은 취소됩니다.

▶ 예: DDL 일괄 처리 취소(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 DDL 일괄 처리를 취소하는 방법을 보여줍니다.

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

일괄 DML 시작 및 일괄 실행

다음 문은 2개의 DML 문을 함께 일괄 처리하고 서버에 하나의 호출로 전송합니다. DML 일괄 처리는 트랜잭션의 일부로 또는 자동 커밋 모드에서 실행할 수 있습니다.

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

▶ 예: DML 일괄 처리(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 DML 일괄 처리를 실행하는 방법을 보여줍니다.

-- 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 및 파티션을 나눈 쿼리 문

partitionQuery API는 쿼리를 더 작은 부분이나 파티션으로 나누고 여러 머신을 사용하여 동시에 파티션을 가져옵니다. 각 파티션은 파티션 토큰으로 식별됩니다. PartitionQuery API는 전체 데이터베이스 내보내기 또는 스캔과 같은 대량 작업에 사용되므로 표준 쿼리 API보다 지연 시간이 깁니다.

Data Boost를 사용하면 프로비저닝된 Spanner 인스턴스의 기존 워크로드에 거의 영향을 주지 않고 분석 쿼리와 데이터 내보내기를 실행할 수 있습니다. Data Boost는 파티션을 나눈 쿼리만 지원합니다.

SET DATA_BOOST_ENABLED 문을 사용하여 Data Boost를 사용 설정할 수 있습니다.

Spanner JDBC 드라이버는 파티션을 나눈 쿼리를 실행하기 위한 세 가지 대안을 지원합니다.

  • SET AUTO_PARTITION_MODE = true
  • RUN PARTITIONED QUERY sql
  • PARTITION sql 다음에 오는 여러 RUN PARTITION 'partition-token'

이러한 각 방법은 다음 섹션에 설명되어 있습니다.

DATA_BOOST_ENABLED

이 연결이 파티션을 나눈 쿼리에 Data Boost를 사용해야 하는지 여부를 나타내는 BOOL 유형의 속성입니다. 기본값은 false입니다.

SHOW VARIABLE DATA_BOOST_ENABLED
SET DATA_BOOST_ENABLED = { true | false }

▶ 예: Data Boost를 사용하여 쿼리 실행(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 Data Boost를 사용하여 쿼리하는 방법을 보여줍니다.

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

전체 예시는 DataBoostExample을 참조하세요.

AUTO_PARTITION_MODE

연결이 실행되는 모든 쿼리에 대해 파티션을 나눈 쿼리를 자동으로 사용하는지 여부를 나타내는 BOOL 유형의 속성입니다.

SHOW VARIABLE AUTO_PARTITION_MODE
SET AUTO_PARTITION_MODE = { true | false}
  • 연결에서 실행되는 모든 쿼리에 파티션을 나눈 쿼리를 사용하려면 이 변수를 true로 설정합니다.
  • 또한 연결에서 모든 쿼리에 Data Boost를 사용하려면 DATA_BOOST_ENABLEDtrue로 설정합니다.

기본값은 false입니다.

▶ 예: 실행(확대하려면 클릭)
이 예시에서는 Data Boost를 사용하여 Spanner JDBC 드라이버로 쿼리 2개를 실행합니다.

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

전체 예시는 AutoPartitionModeExample을 참조하세요.

RUN PARTITIONED QUERY

RUN PARTITIONED QUERY <sql>

Spanner에서 쿼리를 파티션을 나눈 쿼리로 실행합니다. Data Boost를 사용하여 쿼리를 실행하려면 DATA_BOOST_ENABLEDtrue로 설정되어 있는지 확인합니다.

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

Spanner JDBC 드라이버는 내부적으로 쿼리를 파티션으로 나누고 파티션을 동시에 실행합니다. 결과는 결과 조합 하나에 병합되어 애플리케이션에 반환됩니다. 파티션을 실행하는 작업자 스레드 수를 MAX_PARTITIONED_PARALLELISM 변수로 설정할 수 있습니다.

전체 예시는 RunPartitionedQueryExample을 참조하세요.

PARTITION <SQL>

PARTITION <sql>

Spanner에 대해 쿼리를 실행할 파티션의 목록을 만들고 이러한 파티션 토큰 목록을 반환합니다. 각 파티션 토큰은 RUN PARTITION 'partition-token' 명령어를 사용하여 동일한 클라이언트 또는 다른 클라이언트의 별도 연결에서 실행될 수 있습니다.

▶ 예: 파티션 쿼리(확대하려면 클릭)
다음 예시에서는 쿼리를 분할한 후 Spanner JDBC 드라이버를 사용하여 각 파티션을 개별적으로 실행하는 방법을 보여줍니다.

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

전체 예시는 PartitionQueryExample을 참조하세요.

RUN PARTITION 'partition-token'

RUN PARTITION 'partition-token'

이전에 PARTITION 명령어에서 반환한 쿼리 파티션을 실행합니다. 파티션 토큰을 만든 데이터베이스와 동일한 데이터베이스에 연결된 모든 연결에서 이 명령어를 실행할 수 있습니다.

MAX_PARTITIONED_PARALLELISM

Spanner JDBC 드라이버가 파티션을 실행하는 데 사용하는 작업자 스레드 수를 나타내는 INT64 유형의 속성입니다. 이 값은 다음 용도로 사용됩니다.

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

Spanner JDBC 드라이버에서 파티션을 실행하는 데 사용할 수 있는 최대 작업자 스레드 수를 설정합니다. 이 값을 0으로 설정하면 Spanner JDBC 드라이버가 클라이언트 머신의 CPU 코어 수를 최댓값으로 사용하도록 지시합니다.

기본값은 0입니다.

저장 지점 명령어

다음 문은 트랜잭션에서 에뮬레이션된 저장 지점을 사용 설정 및 중지합니다. java.sql.Connection#setSavepoint() 메서드를 호출하여 저장 지점을 만들 수 있습니다.

Spanner JDBC 드라이버는 저장 지점을 에뮬레이션하여 중첩 트랜잭션에 이러한 저장 지점을 사용하는 프레임워크를 지원합니다. 저장 지점은 트랜잭션의 문에서 반환한 결과에 대해 실행 중인 체크섬을 추적하여 에뮬레이션됩니다. 저장 지점으로 롤백하면 Spanner JDBC 드라이버가 트랜잭션을 롤백한 후 저장 지점이 설정된 지점까지 트랜잭션을 재시도합니다. 재시도의 체크섬을 초기 트랜잭션의 체크섬과 비교하여 동일한 결과가 반환되었는지 확인합니다.

SAVEPOINT_SUPPORT

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

현재 SAVEPOINT_SUPPORT 구성을 나타내는 STRING 유형의 속성입니다. 가능한 값은 다음과 같습니다.

  • DISABLED: 모든 저장 지점 명령어가 사용 중지되며 실패합니다.
  • FAIL_AFTER_ROLLBACK: 저장 지점 명령어가 사용 설정됩니다. 저장 지점으로 롤백하면 전체 트랜잭션이 롤백됩니다. 저장 지점으로 롤백한 후 트랜잭션을 사용하려고 시도하면 트랜잭션이 실패합니다.
  • ENABLED: 모든 저장 지점 명령어가 사용 설정됩니다. 저장 지점으로 롤백하면 트랜잭션이 롤백되고 저장 지점으로 재시도가 수행됩니다. 저장 지점까지 트랜잭션에서 사용한 기본 데이터가 변경된 경우 이 작업은 AbortedDueToConcurrentModificationException 오류와 함께 실패합니다.

기본값은 FAIL_AFTER_ROLLBACK입니다.

활성 트랜잭션이 없는 경우에만 이 변수 값을 변경할 수 있습니다.

▶ 예: 저장 지점 지원(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버에서 저장 지점 지원을 사용 설정 및 중지하는 방법을 보여줍니다.

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

다음 단계

JDBC를 GoogleSQL 언어 데이터베이스에 연결하는 방법을 알아보세요.