Spanner JDBC 드라이버(Java 데이터베이스 연결)는 세션 관리 문을 지원하므로 연결 상태를 수정하고 트랜잭션을 실행하며 문의 배치를 효율적으로 실행할 수 있습니다.
다음 명령어는 PostgreSQL 언어 데이터베이스에 적용됩니다.
연결 문
다음 문은 현재 연결의 속성을 변경하거나 표시합니다.
SPANNER.READONLY
연결이 읽기 전용 모드인지 여부를 나타내는 불리언입니다. 기본값은 false
입니다.
SHOW [VARIABLE] SPANNER.READONLY
SET SPANNER.READONLY {TO|=} { true | false }
활성 트랜잭션이 없는 경우에만 이 속성 값을 변경할 수 있습니다.
▶ 예: 읽기 전용 트랜잭션(확대하려면 클릭)
다음 예시에서는 이 속성을 사용하여 Spanner에서 읽기 전용 트랜잭션을 실행하는 방법을 보여줍니다.
SET SPANNER.READONLY = TRUE;
-- This transaction is a read-only transaction.
BEGIN TRANSACTION;
-- The following two queries both use the read-only transaction.
SELECT 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
연결이 자동 커밋 모드인지 여부를 나타내는 불리언입니다. 기본값은 true
입니다.
SHOW [VARIABLE] AUTOCOMMIT
SET AUTOCOMMIT {TO|=} { true | false }
활성 트랜잭션이 없는 경우에만 이 속성 값을 변경할 수 있습니다.
AUTOCOMMIT
이 false로 설정되면 COMMIT
또는 ROLLBACK
을 실행한 후 새 트랜잭션이 자동으로 시작됩니다. 가장 먼저 실행하는 문에서 트랜잭션이 시작됩니다.
▶ 예: 자동 커밋(확대하려면 클릭)
다음 예시에서는 autocommit
속성을 사용하는 방법을 보여줍니다.
-- The default value for AUTOCOMMIT is true.
SHOW AUTOCOMMIT;
-- This insert statement is automatically committed after it is executed, as
-- the connection is in autocommit mode.
INSERT INTO T (id, col_a, col_b) VALUES (1, 100, 1);
-- Turning off autocommit means that a new transaction is automatically started
-- when the next statement is executed.
SET AUTOCOMMIT = FALSE;
-- The following statement starts a new transaction.
INSERT INTO T (id, col_a, col_b) VALUES (2, 200, 2);
-- This statement uses the same transaction as the previous statement.
INSERT INTO T (id, col_a, col_b) VALUES (3, 300, 3);
-- Commit the current transaction with the two INSERT statements.
COMMIT;
-- Transactions can also be executed in autocommit mode by executing the BEGIN
-- statement.
SET AUTOCOMMIT = 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
연결이 취소된 트랜잭션을 자동으로 재시도하는지 여부를 나타내는 불리언입니다. 기본값은 true
입니다.
SHOW [VARIABLE] SPANNER.RETRY_ABORTS_INTERNALLY
SET SPANNER.RETRY_ABORTS_INTERNALLY {TO|=} { true | false }
이 속성의 값은 트랜잭션이 시작된 후(BEGIN TRANSACTION
참조)와 트랜잭션 내에서 문이 실행되기 전에만 변경할 수 있습니다.
SPANNER.RETRY_ABORTS_INTERNALLY
를 true로 설정하면 연결이 클라이언트 애플리케이션에 반환하는 모든 데이터의 체크섬을 유지합니다. 이는 트랜잭션이 Spanner에 의해 중단된 경우 다시 시도하는 데 사용됩니다.
기본값은 true
입니다. 애플리케이션에서 이미 취소된 트랜잭션을 재시도하는 경우 이 값을 false
로 설정하는 것이 좋습니다.
SPANNER.AUTOCOMMIT_DML_MODE
DML(데이터 조작 언어) 문에 대한 자동 커밋 모드를 나타내는 STRING
속성입니다.
SHOW [VARIABLE] SPANNER.AUTOCOMMIT_DML_MODE
SET SPANNER.AUTOCOMMIT_DML_MODE {TO|=} { '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 SPANNER.AUTOCOMMIT_DML_MODE = 'PARTITIONED_NON_ATOMIC';
-- Delete all singers that have been marked as inactive.
-- This statement is executed using Partitioned DML.
DELETE
FROM singers
WHERE active=false;
-- Change DML mode back to standard `TRANSACTIONAL`.
SET SPANNER.AUTOCOMMIT_DML_MODE = 'TRANSACTIONAL';
STATEMENT_TIMEOUT
문에 대한 현재 제한 시간 값을 나타내는 STRING
유형의 속성입니다.
SHOW [VARIABLE] STATEMENT_TIMEOUT
SET STATEMENT_TIMEOUT {TO|=} { '<int8>{ s | ms | us | ns }' | <int8> | DEFAULT }
int8
값은 시간 단위를 나타내는 서픽스가 뒤에 오는 정수입니다. DEFAULT
는 0초를 의미하며, 이는 제한 시간이 없다는 것입니다. 단위가 없는 int8
숫자는 밀리초를 나타냅니다. 문 제한 시간 값이 설정되었을 때 문이 지정된 제한 시간 값보다 오래 걸리면 java.sql.SQLTimeoutException
오류가 발생하고 트랜잭션이 무효화됩니다.
지원되는 시간 단위는 다음과 같습니다.
s
: 초ms
: 밀리초us
: 마이크로초ns
: 나노초
기본값은 제한 시간이 없음을 의미하는 0입니다.
트랜잭션 동안 문 제한 시간은 트랜잭션을 무효화하고 무효화된 트랜잭션(ROLLBACK
예외)의 모든 후속 문은 실패하고 Spanner JDBC 드라이버가 java.sql.SQLTimeoutException
을 처리합니다.
SPANNER.READ_ONLY_STALENESS
Spanner가 AUTOCOMMIT
모드에서 읽기 전용 트랜잭션과 쿼리에 사용하는 현재 읽기 전용 비활성 설정을 나타내는 STRING
유형의 속성입니다.
SHOW [VARIABLE] SPANNER.READ_ONLY_STALENESS SET SPANNER.READ_ONLY_STALENESS {TO|=} staleness_type staleness_type: { 'STRONG' | 'MIN_READ_TIMESTAMP timestamp' | 'READ_TIMESTAMP timestamp' | 'MAX_STALENESS <int8>{ s | ms | us | ns }' | 'EXACT_STALENESS <int8>{ s | ms | us | ns }' }
읽기 전용 비활성 값은 모든 후속 읽기 전용 트랜잭션과 AUTOCOMMIT
모드의 모든 쿼리에 적용됩니다.
기본값은 STRONG
입니다.
타임스탬프 경계 옵션은 다음과 같습니다.
STRONG
은 Spanner에게 강력 읽기를 수행하라고 지시합니다.MAX_STALENESS
는 Spanner가now()
를 기준으로 제한된 비활성 읽기를 수행하는 데 사용하는 시간 간격을 정의합니다.MIN_READ_TIMESTAMP
는 Spanner가 제한된 비활성 읽기를 수행하는 데 사용하는 절대 시간을 정의합니다.EXACT_STALENESS
는 Spanner가now()
를 기준으로 완전 비활성 읽기를 수행하는 데 사용하는 시간 간격을 정의합니다.READ_TIMESTAMP
는 Spanner가 완전 비활성 읽기를 수행하는 데 사용하는 절대 시간을 정의합니다.
타임스탬프는 다음 형식을 사용해야 합니다.
YYYY-[M]M-[D]DT[[H]H:[M]M:[S]S[.DDDDDD]][timezone]
MAX_STALENESS
및 EXACT_STALENESS
값 설정에 지원되는 시간 단위는 다음과 같습니다.
s
: 초ms
: 밀리초us
: 마이크로초ns
: 나노초
활성 트랜잭션이 없는 경우에만 이 속성 값을 수정할 수 있습니다.
▶ 예: 읽기 전용 비활성(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버에서 커스텀 비활성 값을 사용하여 쿼리를 실행하는 방법을 보여줍니다.
-- 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
최적화 도구 버전을 나타내는 STRING
유형의 속성입니다. 버전은 정수 또는 'LATEST
'입니다.
SHOW [VARIABLE] SPANNER.OPTIMIZER_VERSION
SET SPANNER.OPTIMIZER_VERSION {TO|=} { 'version'|'LATEST'|'' }
연결에서 다음 문에 사용할 최적화 도구 버전을 설정합니다. 최적화 도구 버전이 ''
(빈 문자열)로 설정된 경우 Spanner가 최신 버전을 사용합니다. 최적화 도구 버전이 설정되지 않으면 Spanner가 데이터베이스 수준에서 설정된 최적화 도구 버전을 사용합니다.
기본값은 ''
입니다.
▶ 예: 최적화 도구 버전(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버와 함께 특정 최적화 도구 버전을 사용하여 쿼리를 실행하는 방법을 보여줍니다.
-- 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
이 연결에서 사용되는 현재 최적화 도구 통계 패키지를 나타내는 STRING
유형의 속성입니다.
SHOW [VARIABLE] SPANNER.OPTIMIZER_STATISTICS_PACKAGE
SET SPANNER.OPTIMIZER_STATISTICS_PACKAGE {TO|=} { '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 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
이 연결의 트랜잭션에 대한 통계를 반환해야 하는지 여부를 나타내는 BOOL
유형의 속성입니다. SHOW SPANNER.COMMIT_RESPONSE
명령어를 실행하면 반환된 통계를 볼 수 있습니다.
SHOW [VARIABLE] SPANNER.RETURN_COMMIT_STATS
SET SPANNER.RETURN_COMMIT_STATS {TO|=} { true | false }
기본값은 false
입니다.
▶ 예: 커밋 통계(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 트랜잭션의 커밋 통계를 보는 방법을 보여줍니다.
-- 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
Spanner 요청에 대한 상대적 우선순위를 나타내는 STRING
유형의 속성입니다. 이 우선순위가 Spanner 스케줄러에 대한 힌트 역할을 하지만 실행 순서를 보장하지는 않습니다.
SHOW [VARIABLE] SPANNER.RPC_PRIORITY
SET SPANNER.RPC_PRIORITY = {'HIGH'|'MEDIUM'|'LOW'|'NULL'}
'NULL'
은 요청에 힌트가 포함되지 않아야 함을 의미합니다.
기본값은 'NULL'
입니다.
또한 문 힌트를 사용하여 RPC 우선순위를 지정할 수 있습니다.
/*@RPC_PRIORITY=PRIORITY_LOW*/ SELECT * FROM Albums
자세한 내용은 Priority
를 참조하세요.
태그
다음 문은 요청 및 트랜잭션 태그를 관리합니다.
SPANNER.STATEMENT_TAG
다음 문의 요청 태그가 포함된 STRING
유형의 속성입니다.
SHOW [VARIABLE] SPANNER.STATEMENT_TAG
SET SPANNER.STATEMENT_TAG {TO|=} 'tag-name'
다음에 실행할 문의 요청 태그를 설정합니다. 문 하나에 태그 하나만 설정할 수 있습니다. 태그는 여러 문을 포괄하지 않으며 문 단위로 설정해야 합니다. 요청 태그를 빈 문자열(''
)로 설정하여 삭제할 수 있습니다.
기본값은 ''
입니다.
동일한 문에 대한 트랜잭션 태그와 문 태그를 모두 설정할 수 있습니다.
또한 문 힌트를 사용하여 문 태그를 추가할 수 있습니다.
/*@STATEMENT_TAG='my-tag'*/ SELECT * FROM Albums
자세한 내용은 요청 태그 및 트랜잭션 태그를 사용한 문제 해결을 참조하세요.
▶ 예: 문 태그(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 문 태그를 설정하는 방법을 보여줍니다.
-- 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
다음 트랜잭션에 대한 트랜잭션 태그가 포함된 STRING
유형의 속성입니다.
SHOW [VARIABLE] SPANNER.TRANSACTION_TAG
SET SPANNER.TRANSACTION_TAG {TO|=} 'tag-name'
실행할 트랜잭션의 트랜잭션 태그를 설정합니다. 트랜잭션 하나에 태그 하나만 설정할 수 있습니다. 태그는 여러 트랜잭션을 포괄하지 않으며 트랜잭션 단위로 설정해야 합니다. 트랜잭션 태그를 빈 문자열(''
)로 설정하여 삭제할 수 있습니다. 트랜잭션 태그는 트랜잭션에서 문이 실행되기 전에 설정해야 합니다.
기본값은 ''
입니다.
동일한 문에 대한 트랜잭션 태그와 문 태그를 모두 설정할 수 있습니다.
자세한 내용은 요청 태그 및 트랜잭션 태그를 사용한 문제 해결을 참조하세요.
▶ 예: 트랜잭션 태그(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 트랜잭션 태그를 설정하는 방법을 보여줍니다.
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;
트랜잭션 문
다음 문은 Spanner 트랜잭션을 관리하고 커밋합니다.
트랜잭션 격리 수준
SHOW [VARIABLE] TRANSACTION ISOLATION LEVEL
STRING
유형의 행 1개와 열 1개로 결과 조합을 반환합니다. 반환되는 값은 항상 serializable
입니다.
SPANNER.READ_TIMESTAMP
SHOW [VARIABLE] SPANNER.READ_TIMESTAMP
가장 최근의 읽기 전용 트랜잭션의 읽기 타임스탬프를 포함하는 TIMESTAMP
유형인 하나의 행과 하나의 열로 결과 조합을 반환합니다. 이 문은 읽기 전용 트랜잭션이 아직 활성 상태이고 하나 이상의 쿼리를 실행한 경우 또는 읽기 전용 트랜잭션이 커밋된 직후 및 새 트랜잭션이 시작되기 전에만 타임스탬프를 반환합니다. 그렇지 않은 경우 결과는 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 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
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 SPANNER.COMMIT_TIMESTAMP;
SPANNER.COMMIT_RESPONSE
SHOW [VARIABLE] SPANNER.COMMIT_RESPONSE
행 1개와 열 2개로 결과 집합을 반환합니다.
COMMIT_TIMESTAMP
(유형=TIMESTAMP
)는 가장 최근의 트랜잭션이 커밋된 시기를 나타냅니다.MUTATION_COUNT
(유형=INT64
)는 커밋된 트랜잭션에 적용된 변형 개수를 나타냅니다. 이 값은 에뮬레이터에서 실행될 때 항상 비어 있습니다.
변형 수는 트랜잭션 커밋 전에 SET SPANNER.RETURN_COMMIT_STATS
가 true
로 설정된 경우에만 제공됩니다.
▶ 예: 커밋 응답(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버를 사용하여 쓰기 작업의 마지막 커밋 응답을 보는 방법을 보여줍니다.
-- 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 } [ TRANSACTION | WORK ]
{ START | BEGIN } [ TRANSACTION | WORK ] [{ READ ONLY | READ WRITE }]
새 트랜잭션을 시작합니다. TRANSACTION
및 WORK
키워드는 선택사항이고 동등하며 영향을 미치지 않습니다.
COMMIT
또는ROLLBACK
을 사용하여 트랜잭션을 종료합니다.AUTOCOMMIT
모드를 사용 설정한 경우 이 문은 일시적으로AUTOCOMMIT
모드에서 연결을 해제합니다. 트랜잭션이 종료되면 이 연결은AUTOCOMMIT
모드로 돌아갑니다.READ ONLY
또는READ WRITE
를 지정하지 않으면 트랜잭션 모드가 세션의 기본 트랜잭션 모드로 결정됩니다. 이 기본값은SET SESSION CHARACTERISTICS AS TRANSACTION
명령어 사용 또는READONLY
변수 설정을 통해 설정됩니다.
활성 트랜잭션이 없는 경우에만 이 문을 실행할 수 있습니다.
▶ 예: 트랜잭션 시작(확대하려면 클릭)
다음 예시에서는 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;
-- 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 [TRANSACTION | WORK]
COMMIT [ TRANSACTION | WORK ]
현재 트랜잭션을 커밋합니다. TRANSACTION
및 WORK
키워드는 선택사항이고 동등하며 영향을 미치지 않습니다.
- 읽기-쓰기 트랜잭션을 커밋하면 이 트랜잭션의 모든 업데이트가 다른 트랜잭션에 표시되고 Spanner에서 트랜잭션의 모든 잠금이 해제됩니다.
- 읽기 전용 트랜잭션을 커밋하면 현재 읽기 전용 트랜잭션이 종료됩니다. 이후 문은 새 트랜잭션을 시작합니다. 읽기 전용 트랜잭션의 경우
COMMIT
과ROLLBACK
간의 의미적 차이가 없습니다.
활성 트랜잭션이 있는 경우에만 이 문을 실행할 수 있습니다.
▶ 예: 트랜잭션 커밋(확대하려면 클릭)
다음 예시에서는 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 READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
COMMIT;
{ ABORT | ROLLBACK } [TRANSACTION | WORK]
{ ABORT | ROLLBACK } [TRANSACTION | WORK]
현재 트랜잭션의 ROLLBACK
을 수행합니다. TRANSACTION
및 WORK
키워드는 선택사항이고 동등하며 영향을 미치지 않습니다.
- 읽기 전용 트랜잭션의
ROLLBACK
을 수행하면 버퍼링된 변형이 삭제되고 Spanner에 트랜잭션이 롤백되고 트랜잭션에 있는 모든 잠금이 해제됩니다. - 읽기 전용 트랜잭션의
ROLLBACK
을 수행하면 현재 읽기 전용 트랜잭션을 종료합니다. 이후 모든 문은 새 트랜잭션을 시작합니다. 연결에 대한 읽기 전용 트랜잭션의 경우COMMIT
과ROLLBACK
간의 의미적 차이가 없습니다.
활성 트랜잭션이 있는 경우에만 이 문을 실행할 수 있습니다.
▶ 예: 트랜잭션 롤백(확대하려면 클릭)
다음 예시에서는 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 READ ONLY;
SELECT FirstName, LastName
FROM Singers
ORDER BY LastName;
ROLLBACK;
트랜잭션 설정
SET TRANSACTION { READ ONLY | READ WRITE }
현재 트랜잭션의 트랜잭션 모드를 설정합니다.
AUTOCOMMIT
이 false
이거나 BEGIN [TRANSACTION | WORK]
를 실행하여 트랜잭션을 시작했지만 트랜잭션에서 아직 어떤 문도 실행하지 않은 경우에만 이 문을 실행할 수 있습니다.
이 문은 현재 트랜잭션에 대해서만 트랜잭션 모드를 설정합니다. 트랜잭션이 커밋되거나 롤백되면 다음 트랜잭션이 연결에 기본 모드를 사용합니다.
(SET SESSION CHARACTERISTICS
를 참조하세요.)
▶ 예: 트랜잭션 설정(확대하려면 클릭)
다음 예시에서는 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;
SET SESSION CHARACTERISTICS
SET SESSION CHARACTERISTICS AS TRANSACTION { READ ONLY | READ WRITE }
세션에서 트랜잭션에 대한 기본 트랜잭션 모드를 READ ONLY
또는 READ WRITE
로 설정합니다. 이 문은 활성 트랜잭션이 없는 경우에만 허용됩니다.
SET TRANSACTION
명령어가 이 설정을 재정의할 수 있습니다.
일괄 문
다음 문은 일괄 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 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
현재 DDL 일괄 처리의 버퍼링된 DDL 문을 모두 데이터베이스로 전송하고 Spanner에서 이러한 문이 실행되기를 기다린 다음 현재 DDL 일괄 처리를 종료합니다.
Spanner에서 하나 이상의 DDL 문을 실행할 수 없는 경우 RUN BATCH
는 Spanner가 실행할 수 없는 첫 번째 DDL 문에 대한 오류를 반환합니다. 그렇지 않은 경우 RUN BATCH
를 반환합니다.
일괄 처리 취소
ABORT 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 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;
일괄 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 SPANNER.DATA_BOOST_ENABLED
문을 사용하여 현재 연결에서 Data Boost를 사용 설정할 수 있습니다.
JDBC 드라이버는 파티션을 나눈 쿼리를 실행하기 위한 세 가지 대안을 지원합니다.
SET SPANNER.AUTO_PARTITION_MODE = true
RUN PARTITIONED QUERY sql
PARTITION sql
다음에 여러RUN PARTITION 'partition-token'
이러한 각 방법은 다음 섹션에 설명되어 있습니다.
SPANNER.DATA_BOOST_ENABLED
이 연결이 파티션을 나눈 쿼리에 Data Boost를 사용해야 하는지 여부를 나타내는 BOOL
유형의 속성입니다. 기본값은 false
입니다.
SHOW [VARIABLE] SPANNER.DATA_BOOST_ENABLED
SET SPANNER.DATA_BOOST_ENABLED {TO|=} { true | false }
이 연결에서 파티션을 나눈 쿼리에 Data Boost를 사용해야 하는지 여부를 설정합니다.
기본값은 false
입니다.
▶ 예: Data Boost를 사용하여 쿼리 실행(확대하려면 클릭)
다음 예시에서는 Spanner JDBC 드라이버로 Data Boost를 사용하여 쿼리하는 방법을 보여줍니다.
-- 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;
전체 예시는 PostgreSQL DataBoostExample을 참조하세요.
SPANNER.AUTO_PARTITION_MODE
연결이 실행되는 모든 쿼리에 대해 파티션을 나눈 쿼리를 자동으로 사용하는지 여부를 나타내는 BOOL
유형의 속성입니다.
SHOW [VARIABLE] SPANNER.AUTO_PARTITION_MODE
SET SPANNER.AUTO_PARTITION_MODE {TO|=} { true | false}
- 연결에서 실행되는 모든 쿼리에 파티션을 나눈 쿼리를 사용하려면 이 변수를
true
로 설정합니다. - 또한 연결에서 모든 쿼리에 Data Boost를 사용하려면
SPANNER.DATA_BOOST_ENABLED
를true
로 설정합니다.
기본값은 false
입니다.
▶ 예: 실행(확대하려면 클릭)
이 예시에서는 Data Boost를 사용하여 Spanner JDBC 드라이버로 쿼리 2개를 실행합니다.
SET SPANNER.AUTO_PARTITION_MODE = true
SET SPANNER.DATA_BOOST_ENABLED = true
SELECT FirstName, LastName FROM Singers
SELECT SingerId, Title FROM Albums
전체 예시는 PostgreSQL AutoPartitionModeExample을 참조하세요.
RUN PARTITIONED QUERY
RUN PARTITIONED QUERY <sql>
Spanner에서 쿼리를 파티션을 나눈 쿼리로 실행합니다. Data Boost를 사용하여 쿼리를 실행하려면 SPANNER.DATA_BOOST_ENABLED
가 true
로 설정되어 있는지 확인합니다.
SET SPANNER.DATA_BOOST_ENABLED = true
RUN PARTITIONED QUERY SELECT FirstName, LastName FROM Singers
JDBC 드라이버는 내부적으로 쿼리를 파티션으로 나누고 파티션을 동시에 실행합니다. 결과는 결과 조합 하나에 병합되어 애플리케이션에 반환됩니다. 파티션을 실행하는 작업자 스레드 수를 SPANNER.MAX_PARTITIONED_PARALLELISM
변수로 설정할 수 있습니다.
전체 예시는 PostgreSQL RunPartitionedQueryExample을 참조하세요.
PARTITION <SQL>
PARTITION <sql>
Spanner에 대해 쿼리를 실행할 파티션의 목록을 만들고 이러한 파티션 토큰 목록을 반환합니다. 각 파티션 토큰은 RUN PARTITION 'partition-token'
명령어를 통해 같은 호스트나 다른 호스트의 별도의 JDBC 연결에서 실행될 수 있습니다.
▶ 예: 파티션 쿼리(확대하려면 클릭)
다음 예시에서는 쿼리를 분할한 후 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';
전체 예시는 PostgreSQL PartitionQueryExample을 참조하세요.
RUN PARTITION 'partition-token'
RUN PARTITION 'partition-token'
이전에 PARTITION
명령어에서 반환한 쿼리 파티션을 실행합니다. 파티션 토큰을 만든 데이터베이스와 동일한 데이터베이스에 연결된 모든 JDBC 연결에서 이 명령어를 실행할 수 있습니다.
전체 예시는 PostgreSQL PartitionQueryExample을 참조하세요.
SPANNER.MAX_PARTITIONED_PARALLELISM
Spanner JDBC 드라이버가 파티션을 실행하는 데 사용하는 작업자 스레드 수를 나타내는 int8
유형의 속성입니다. 이 값은 다음 용도로 사용됩니다.
SPANNER.AUTO_PARTITION_MODE = true
RUN PARTITIONED QUERY sql
SHOW [VARIABLE] SPANNER.MAX_PARTITIONED_PARALLELISM
SET SPANNER.MAX_PARTITIONED_PARALLELISM = <int8>
Spanner JDBC 드라이버에서 파티션을 실행하는 데 사용할 수 있는 최대 작업자 스레드 수를 설정합니다. 이 값을 0
으로 설정하면 Spanner JDBC 드라이버가 클라이언트 머신의 CPU 코어 수를 최댓값으로 사용하도록 지시합니다.
기본값은 0
입니다.
저장 지점 명령어
다음 문은 트랜잭션에서 에뮬레이션된 저장 지점을 사용 설정 및 중지합니다. java.sql.Connection#setSavepoint()
메서드를 호출하여 저장 지점을 만들 수 있습니다.
Spanner JDBC 드라이버는 저장 지점을 에뮬레이션하여 중첩 트랜잭션에 이러한 저장 지점을 사용하는 프레임워크를 지원합니다. 저장 지점은 트랜잭션의 문에서 반환한 결과에 대해 실행 중인 체크섬을 추적하여 에뮬레이션됩니다. 저장 지점으로 롤백하면 Spanner JDBC 드라이버가 트랜잭션을 롤백한 후 저장 지점이 설정된 지점까지 트랜잭션을 재시도합니다. 재시도의 체크섬을 초기 트랜잭션의 체크섬과 비교하여 동일한 결과가 반환되었는지 확인합니다.
SPANNER.SAVEPOINT_SUPPORT
SHOW [VARIABLE] SPANNER.SAVEPOINT_SUPPORT
SET SPANNER.SAVEPOINT_SUPPORT {TO|=} { '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 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);
}
다음 단계
JDBC를 PostgreSQL 언어 데이터베이스에 연결하는 방법 알아보기