Насколько широка изоляция транзакций в Google App Engine? - PullRequest
3 голосов
/ 14 октября 2011

Где - на каком уровне - блокировка и коллизии происходят в транзакционных операциях в одной и той же группе объектов?В корне?У какого-нибудь распространенного, достаточно широкого родителя?

Мне не ясно, что такое «группа объектов» для транзакции.Всегда ли это группа, исходящая из корневого объекта (без родителя), или есть механизм, который выбирает группу, достаточно широкую для транзакции.

Например, когда у меня есть структура модели, подобная этой:

- School
  - Teacher
  - Class
    - Course
      - Lesson
      - Evaluation
    - Student
      - Guardian 
      - Grade
      - PresenceMarker
    - TextBook

Всегда ли мои транзакционные операции относятся к "группе объектов" как группе, созданной на уровне школы (независимо от уровнягде происходит фактическая операция), или когда я обновляю сущности учеников в том же классе, я могу столкнуться только с другой транзакционной операцией, происходящей ниже той же сущности класса.Школа или есть группы подэлементов, происходящие на каждом другом уровне в иерархии?Если есть группы подэлементов, используются ли они для изоляции транзакций?

ОБНОВЛЕНИЕ:

Взяв Счетчики Sharding в качестве другого примера.Сработает ли шардинг, если все шарды имеют общего родителя?Приведет ли обновление отдельного сегмента счетчика к обновлениям коллизий транзакций на других сегментах?

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Транзакции в App Engine происходят на уровне группы объектов. (см. документы здесь и здесь )

существуют ли группы подэлементов, происходящие на каждом другом уровне в иерархии?

Нет никаких групп под-сущностей Каждая сущность находится ровно в одной Группе сущностей, потому что у нее один предок. В вашем примере все ваши модели в конечном итоге принадлежат группе Школы.

Сработает ли осколок, если у всех осколков общий родитель?

Чтобы шард работал так, как задумано, каждый шард должен быть в своей собственной группе сущностей. Если вы посмотрите на пример кода, вы увидите, что каждый шард находится в своей собственной группе. Вы также можете видеть, что, хотя метод increment () использует транзакцию, метод get_count () - нет. Приращение влияет только на одну группу, а get_count получает данные из нескольких групп.

Примечание. Последний выпуск App Engine допускает межгрупповые транзакции, но это особый случай, и определение группы не изменилось.

0 голосов
/ 14 октября 2011

Насколько я понял, документация GAE всегда использует корень дерева группы сущностей для своего журнала, который управляет блокировками и транзакциями.

...