2013-07-04 4 views
9

W Google App Engine izolacja transakcji jest nazywana izolacją SNAPSHOT, w której nie widać wcześniejszych usunięć lub umieszczeń w samej transakcji, a jedynie stan magazynu danych w momencie rozpoczęcia transakcji (https://developers.google.com/appengine/docs/python/datastore/transactions). W starszym artykule mówi się, że poziom transakcji jest w rzeczywistości SERIALIZABLE (https://developers.google.com/appengine/articles/transaction_isolation).Izolacja transakcji w silniku aplikacji Google

Zestaw testowy zgodności Google (TCK) pokazuje, że rzeczywiście jest izolacją SNAPSHOT, ale we wcześniej wspomnianym artykule mówi "Z drugiej strony, poziom izolacji jest domyślnie ustawiony na SNAPSHOT, z możliwością zmiany na SERIALIZOWANE ".

Moje pytanie brzmi: w jaki sposób włączyć poziom izolacji, aby uzyskać możliwość SERII?

+1

Dobre pytanie, nie jest nawet udokumentowane. –

+0

Coś nie udokumentowane w dokumentach GAE? Wstrząsający. Przynajmniej jeśli członek zespołu GAE odpowie na to pytanie, ktoś będzie mógł go znaleźć za pomocą wyszukiwarki Google. –

+0

@RomanLevin Nie wydaje mi się to szokujące ... btw datastore API Reference link z zaakceptowanej odpowiedzi przestał działać (nie szokuje) – themihai

Odpowiedz

3

Możesz zobaczyć, jak zmienić poziom izolacji w BeginTransaction API Reference. W tej chwili można go konfigurować tylko w interfejsie API Google Cloud Datastore HTTP i jest on ustawiony jako SERIALIZABLE dla wszystkich zestawów SDK App Engine. Jednak nie sądzę, że zrobi to, co chcesz.

SNAPSHOT vs SERIALIZABLE kontroluje izolację transakcji lub interakcje transakcji współbieżnych. Nie kontroluje, w jaki sposób transakcja wchodzi w interakcję z samym sobą (chociaż w niektórych systemach te dwie rzeczy są łączone).

W Datastore ustawienie SERIALIZABLE nie sprawi, że transakcja zobaczy własne, niezatwierdzone mutacje. Oznacza to tylko, że współbieżne transakcje będą kolidować, jeśli ich wzorce odczytu i zapisu nie będą poprawne w przypadku serializacji. Na przykład, poniższe dwie transakcje będą zawsze zderzają się podczas korzystania SERIALIZABLE izolacji:

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

Ponieważ żadna z tych dwóch porządków są możliwe:

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

Jednak transakcje te nie muszą zderzyć się z izolacji migawka.

Zarówno SNAPSHOT, jak i SERIALIZABLE odczytane z "migawki" danych, tak jakby dane zostały zmienione w sposób, który koliduje z gwarancjami izolacji transakcji podczas wykonywania transakcji, transakcja nie może zostać zatwierdzona.