2013-07-04 4 views
9

Google App Engine에서 트랜잭션 격리는 SNAPSHOT 격리라고 말합니다. 트랜잭션 격리는 트랜잭션 자체가 이전에 삭제되거나 삽입되지 않았지만 트랜잭션이 시작될 때 데이터 저장소의 상태 만 나타냅니다 (https://developers.google.com/appengine/docs/python/datastore/transactions). 이전 기사에서는 트랜잭션 수준이 실제로 SERIALIZABLE (https://developers.google.com/appengine/articles/transaction_isolation)이라고합니다.Google 애플리케이션 엔진의 트랜잭션 격리

TCK (Google Test Compatibility Kit)는 실제로 SNAPSHOT 격리라고 표시하지만 앞서 언급 한 기사에서 "내부 트랜잭션, 반면에 격리 수준은 기본적으로 SNAPSHOT이며, 직렬화 가능 ".

제 질문은 어떻게 격리 수준을 SERIALIZABLE로 설정할 수 있습니까?

+1

좋은 질문입니다. 문서화되지 않았습니다. –

+0

GAE 문서에 문서화되지 않은 것이 있습니까? 충격적인. 적어도 GAE 팀원이 질문에 대답하면 누군가가 Google 검색을 통해 해당 질문을 찾을 수 있습니다. –

+0

@RomanLevin 전혀 놀랍지 않습니다 ... 데이터 저장소 API를 허용했습니다. 허용 된 응답의 참조 링크가 작동하지 않습니다 (충격적이지는 않음). – themihai

답변

3

BeginTransaction API Reference에서 격리 수준을 변경하는 방법을 볼 수 있습니다. 현재 Google Cloud Datastore HTTP API에서만 구성 가능하며 모든 App Engine SDK에 대해 기본적으로 SERIALIZABLE로 설정됩니다. 그러나 나는 이것이 당신이 원하는 것을 할 것이라고 생각하지 않습니다.

SNAPSHOT 대 SERIALIZABLE은 트랜잭션 격리 또는 동시 트랜잭션이 서로 상호 작용하는 방법을 제어합니다. 트랜잭션이 자체와 상호 작용하는 방식을 제어하지는 못합니다 (일부 시스템에서는 이러한 두 가지가 결합되어 있음).

데이터 저장소에서 SERIALIZABLE을 설정해도 트랜잭션이 커밋되지 않은 돌연변이를 볼 수 없습니다. 직렬화 될 때 읽기 및 쓰기 패턴이 유효하지 않으면 동시 트랜잭션이 충돌합니다. 예를 들어, 다음 두 거래는 반드시 SERIALIZABLE 격리를 사용하는 경우 충돌합니다 : 두 개의 순서 중 어느 것도로서

TX1: READ A, WRITE B' 
TX2: READ B, WRITE A' 

이 가능합니다 :

READ A, WRITE B', READ B (conflict), WRITE A' 
READ B, WRITE A', READ A (conflict), WRITE B' 

그러나, 이러한 거래는 반드시 스냅 숏 격리와 충돌하지 않습니다.

SNAPSHOT과 SERIALIZABLE 모두 데이터의 '스냅 샷'에서 읽습니다. 마치 트랜잭션이 실행되는 동안 트랜잭션 격리 방지와 충돌하는 방식으로 데이터가 변경되는 것처럼 트랜잭션을 커밋 할 수 없습니다.

관련 문제