이 페이지에서는 Spanner에서 반복 가능한 읽기 격리를 사용하는 방법을 설명합니다.
반복 가능한 읽기는 트랜잭션 내 모든 읽기 작업에서 트랜잭션 시작 시에 존재했던 데이터베이스의 일관된 스냅샷을 볼 수 있게 하는 격리 수준입니다. Spanner에서 이 격리 수준은 스냅샷 격리라고도 하는 기법을 통해 구현됩니다. 이 방식은 다른 트랜잭션에서 수정할 수 있는 데이터를 수많은 트랜잭션이 읽는 높은 읽기-쓰기 동시 실행 시나리오에서 유용합니다. 고정 스냅샷을 사용하면 반복 가능한 읽기가 더 엄격한 직렬화 가능 격리 수준의 성능 영향을 방지합니다. 읽기는 잠금을 획득하지 않고 동시 쓰기를 차단하지 않고 실행될 수 있으므로 직렬화 충돌로 인해 다시 시도해야 할 수 있는 트랜잭션이 취소되는 경우가 줄어들 수 있습니다. 자세한 내용은 격리 수준 개요를 참조하세요.
격리 수준 설정
다음 방법을 사용하여 데이터베이스 클라이언트 수준 또는 트랜잭션 수준에서 읽기-쓰기 트랜잭션의 격리 수준을 설정할 수 있습니다.
클라이언트 라이브러리
Go
Java
Node.js
Python
REST
TransactionOptions.isolation_level REST API를 사용하여 트랜잭션 수준에서 읽기-쓰기 및 읽기 전용 트랜잭션의 격리 수준을 설정할 수 있습니다. 유효한 옵션은 TransactionOptions.SERIALIZABLE 및 TransactionOptions.REPEATABLE_READ입니다. 기본적으로 Spanner는 격리 수준을 직렬화 가능한 격리로 설정합니다.
제한사항
반복 가능한 읽기 격리 미리보기에는 다음과 같은 제한사항이 있습니다.
- 스키마에 확인 제약 조건이 있는 경우 문제가 발생할 수 있습니다.
- 확인 제약 조건이 검증되지 않는 알려진 문제가 있으며, 이로 인해 트랜잭션이 커밋될 때 제약 조건 위반이 발생할 수 있습니다. 따라서 스키마에 확인 제약 조건이 있는 경우 미리보기에서 반복 가능한 읽기 격리를 사용하지 않는 것이 좋습니다.
- 트랜잭션이 실행되는 동안 데이터베이스에서 동시 스키마 변경이 발생하면 문제가 발생할 수 있습니다.
- DML 문이
last_statement옵션을 사용하고 DML 문이 실행되는 동안 동시 스키마 변경이 발생하면 내부적으로 재시도하고last_statement옵션이 설정된 후 DML이 잘못 재시도되었다는 오류를 반환할 수 있습니다. 스키마 변경사항이 적용된 후 트랜잭션을 다시 시도하면 이 문제가 해결됩니다. - 트랜잭션의 요청에 클라이언트에서
DEADLINE_EXCEEDED오류가 발생하는 경우 스키마 변경사항이 적용된 후 트랜잭션을 재시도하여 문제를 해결합니다.
- DML 문이
지원되지 않는 사용 사례
- 파티션을 나눈 DML 트랜잭션에서는 반복 가능한 읽기 격리를 설정할 수 없습니다.
- 모든 읽기 전용 트랜잭션은 이미 고정된 스냅샷에서 작동하며 잠금이 필요하지 않으므로 이 트랜잭션 유형에서 반복 가능한 읽기 격리를 설정해도 동작이 변경되지 않습니다.
- Spanner 클라이언트 라이브러리를 사용하여 읽기 전용, 일회용, 파티션 작업에 반복 가능한 읽기 격리를 설정할 수 없습니다. Spanner 클라이언트 라이브러리에는 읽기 전용, 일회용, 파티션 쿼리 작업에 반복 가능한 읽기 격리를 설정하는 옵션이 없습니다.
다음 단계
격리 수준 자세히 알아보기
반복 가능한 읽기 격리에서 SELECT FOR UPDATE를 사용하는 방법 알아보기
TrueTime 및 외적 일관성에서 Spanner 직렬 가능성 및 외적 일관성 자세히 알아보기