트랜잭션은 하나 이상의 항목에 대한 작업 집합입니다. 각 트랜잭션은 원자적 성격을 가집니다. 즉 트랜잭션은 부분적으로 적용되는 경우는 없고 트랜잭션의 작업이 모두 적용되거나 아니면 하나도 적용되지 않는 방식으로 수행됩니다.
트랜잭션 사용
트랜잭션은 270초 후에, 또는 60초 동안 비활성인 경우 만료됩니다.
다음과 같은 경우 작업이 실패할 수 있습니다.
- 동일한 항목에 대해 동시에 실행되는 수정 시도가 너무 많은 경우
- 트랜잭션이 리소스 한도를 초과하는 경우
- Datastore 모드 데이터베이스에 내부 오류가 발생하는 경우
이러한 경우에는 항상 Datastore API가 오류를 반환합니다.
트랜잭션은 선택적 기능입니다. 데이터베이스 작업을 수행하기 위해 반드시 트랜잭션을 사용할 필요는 없습니다.
애플리케이션은 단일 트랜잭션으로 일정한 문 및 작업을 실행할 수 있습니다. 따라서 일부 문 또는 작업에서 예외가 발생하면 전체 데이터베이스 작업이 아무것도 적용되지 않습니다. 애플리케이션은 트랜잭션에서 수행할 작업을 정의합니다.
다음 스니펫은 한 계좌에서 다른 계좌로 송금하는 트랜잭션을 수행하는 방법을 보여줍니다.
C#
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore C# API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Go API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Java API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Node.js API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore PHP API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Python API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Ruby API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
예시를 더욱 간결하게 유지하기 위해 트랜잭션이 실패하는 경우 rollback
을 생략하기도 합니다. 프로덕션 코드에서는 모든 트랜잭션이 명시적으로 커밋되거나 롤백되도록 만드는 것이 중요합니다.
트랜잭션에서 가능한 작업
트랜잭션에서는 원하는 수의 항목을 쿼리하거나 조회할 수 있습니다. 트랜잭션의 최대 크기는 10MiB입니다. 읽기-쓰기 트랜잭션 또는 읽기 전용 트랜잭션을 사용할 수 있습니다.
격리 및 일관성
Datastore 모드 데이터베이스는 직렬화 가능한 격리를 적용합니다. 트랜잭션이 읽거나 수정하는 데이터는 동시에 수정할 수 없습니다.
트랜잭션 내 쿼리 및 조회를 통해 데이터베이스 상태의 일관된 스냅샷을 확인할 수 있습니다. 이 스냅샷에는 항상 트랜잭션 시작 전에 완료된 모든 트랜잭션 및 쓰기의 결과가 포함됩니다.
이 일관된 스냅샷 뷰는 트랜잭션 내 쓰기 후 읽기까지도 확장됩니다. 대부분의 데이터베이스와 달리 Datastore 모드 트랜잭션 내의 쿼리 및 조회를 통해서는 트랜잭션 내부의 이전 쓰기 결과를 확인할 수 없습니다. 특히 트랜잭션 내에서 항목이 수정되거나 삭제된 경우 쿼리 또는 조회를 수행하면 트랜잭션 시작 시점의 원래 버전 항목이 반환되며, 시작 시점에 해당 항목이 없었으면 아무것도 반환되지 않습니다.
트랜잭션 외부에서도 쿼리 및 조회에는 직렬화 가능한 격리가 적용됩니다.
동시 실행 모드
Datastore 모드의 Firestore에서는 세 가지 동시 실행 모드를 지원합니다. 동시 실행 모드는 동시 실행 트랜잭션의 상호작용 방법을 결정하는 데이터베이스 설정입니다. 다음 동시 실행 모드 중 하나를 선택할 수 있습니다.
비관적
읽기-쓰기 트랜잭션은 리더/작성자 잠금을 사용하여 격리 및 직렬화 가능성을 적용합니다. 두 개 이상 동시 읽기-쓰기 트랜잭션이 동일한 데이터를 읽거나 쓰면 한 트랜잭션이 보유한 잠금이 다른 트랜잭션을 지연시킬 수 있습니다. 트랜잭션에 쓰기가 필요하지 않으면 읽기 전용 트랜잭션을 사용하여 성능을 개선하고 다른 트랜잭션과의 경합을 피할 수 있습니다. 읽기 전용 트랜잭션에는 잠금이 필요하지 않습니다.
Datastore 모드의 Firestore 데이터베이스는 기본적으로 비관적 동시 실행 모드를 사용합니다.
낙관적
두 개 이상 동시 실행 읽기-쓰기 트랜잭션이 동일한 데이터를 읽거나 쓸 때는 해당 변경사항을 커밋하는 첫 번째 트랜잭션만 성공합니다. 쓰기를 수행하는 다른 트랜잭션은 커밋 시 실패합니다.
항목 그룹을 사용한 낙관적
앱이 기존 Cloud Datastore의 항목 그룹 트랜잭션 시맨틱스에 의존하는 경우에만 이 동시 실행 모드를 사용합니다. 이 동시 실행 모드는 트랜잭션에 추가 한도를 부여합니다.
- 트랜잭션은 25개의 항목 그룹으로 제한됩니다.
- 항목 그룹에 대한 쓰기가 초당 1회로 제한됩니다.
- 트랜잭션의 쿼리는 상위 쿼리여야 합니다.
동시 실행 모드 보기
Firestore projects.databases REST 리소스를 사용하여 데이터베이스의 동시 실행 모드를 확인합니다.
curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"
동시 실행 모드 변경
데이터베이스의 동시 실행 모드를 변경하려면 Firestore projects.databases REST 리소스에 PATCH
요청을 보냅니다.
curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"concurrencyMode":"CONCURRENCY_MODE"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=concurrencyMode"
각 항목의 의미는 다음과 같습니다.
- CONCURRENCY_MODE는
PESSIMISTIC
,OPTIMISTIC
또는OPTIMISTIC_WITH_ENTITY_GROUPS
입니다. - PROJECT_ID는 Google Cloud 프로젝트의 ID입니다.
트랜잭션 용도
트랜잭션 용도 중 하나는 항목을 현재 값과 관련된 새로운 속성 값으로 업데이트하는 것입니다. 위의 transferFunds
예시에서는 한 계좌에 있는 돈을 인출해 다른 계좌로 이체하여 두 항목에 이 작업을 수행합니다.
Datastore API는 트랜잭션을 자동으로 재시도하지 않지만 재시도를 위한 자체 로직을 추가할 수 있습니다. 예를 들어 다른 요청이 동시에 같은 항목을 업데이트할 때 충돌을 처리하는 경우입니다.
C#
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore C# API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Go API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Java API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Node.js API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore PHP API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Python API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Ruby API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
이 코드가 객체를 가져온 후 수정된 객체를 저장하기 전에 다른 사용자가 항목의 balance
값을 업데이트할 수 있으므로 트랜잭션이 필요합니다. 트랜잭션이 없으면 사용자의 요청은 다른 사용자의 업데이트 전에 balance
값을 사용하고 새 값을 덮어씁니다. 트랜잭션이 있으면 애플리케이션에 다른 사용자의 업데이트가 전달됩니다.
트랜잭션의 다른 일반적인 용도는 명명된 키로 항목을 가져오거나 없으면 만드는 것입니다(이 예시에서는 항목 만들기의 TaskList 예시를 기반으로 빌드함).
C#
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore C# API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Go API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Java API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Node.js API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore PHP API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Python API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Ruby API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
이전과 마찬가지로 트랜잭션은 다른 사용자가 동일한 문자열 ID의 항목을 생성하거나 업데이트하려고 시도하는 경우를 처리해야 합니다. 트랜잭션이 없는 경우 항목이 존재하지 않은 상태에서 2명의 사용자가 생성을 시도하면 두 번째 생성된 내용이 첫 번째 생성 사실을 알지 못한 채 첫 번째 내용을 덮어쓰게 됩니다.
트랜잭션이 실패하는 경우 성공할 때까지 재시도하도록 앱을 설정하거나 앱의 사용자 인터페이스 수준에 전달하여 사용자가 오류를 처리하도록 할 수 있습니다. 매 트랜잭션마다 재시도 루프를 만들 필요는 없습니다.
읽기 전용 트랜잭션
마지막으로, 트랜잭션을 사용하여 데이터베이스의 일관된 스냅샷을 읽을 수 있습니다. 페이지를 렌더링하거나 일관성이 필요한 데이터를 내보내기 위해 여러 번의 읽기가 필요한 경우에 이렇게 하면 유용할 수 있습니다. 이러한 경우에는 읽기 전용 트랜잭션을 생성할 수 있습니다.
읽기 전용 트랜잭션은 항목을 수정할 수는 없지만 그 대신 다른 트랜잭션과 경합하지 않으므로 재시도할 필요가 없습니다. 일반적인 읽기-쓰기 트랜잭션에서 읽기만 수행할 때는 트랜잭션이 동일한 데이터를 수정하는 다른 트랜잭션과 경합할 수 있습니다.
C#
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore C# API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Go API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Java API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Node.js API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore PHP API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Python API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Cloud Datastore용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud Datastore 클라이언트 라이브러리를 참조하세요. 자세한 내용은 Cloud Datastore Ruby API 참고 문서를 확인하세요.
Cloud Datastore에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
다음 단계
- 쿼리 알아보기