Изменилось ли поведение транзакции при возникновении конфликта в хранилище данных пожарного хранилища? - PullRequest
2 голосов
/ 30 января 2020

Я создал новый проект Google Cloud Platform и хранилище данных.

хранилище данных было создано как «Firestore в режиме хранилища данных».

Но я думаю, что хранилище данных Firestore и Old Datastore ведут себя по-разному, если возник конфликт .

например, следующий случай.

procA: -> enter transaction -> get -> put -----------------> exit transaction
procB: -----> enter transaction -> get -> put -> exit transaction

Old Datastore;

  • procB завершен и данные обновлены.
  • procA Произошел конфликт и данные откатаны.

Восстановление в режиме хранилища данных;

  • procB ожидает завершения транзакции, пока не завершится procA. Затем произошел конфликт.
  • procA Completed и данные обновлены.

Это spe c? Я не могу найти документ в документации по Google Cloud Platform.

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Я немного подумал и думаю, что изменение может быть преднамеренным.

В старом поведении, которое вы описываете, в основном короткая транзакция, даже если она начинается после более длинной, успешна , вытесняя более длинный и вызывая его неудачу и повторную попытку. Фактически это дает приоритет более коротким транзакциям.

Но представьте, что у вас есть пик активности с кучей более коротких транзакций - они будут продолжать вытеснять более длинные транзакции, которые будут повторяться до тех пор, пока достижение максимального предела повторных попыток и постоянный сбой. Также увеличивая конкуренцию в хранилище данных из-за повторных попыток. Я действительно столкнулся с таким сценарием в своем приложении, интенсивно использующем транзакции, мне пришлось настроить свои алгоритмы, чтобы обойти его.

В отличие от этого, новое поведение дает всем транзакциям равные шансы на успех, независимо от их продолжительности или уровня. деятельности - нет приоритетной обработки. Это правда, по цене - более короткие транзакции начинаются после более длинных, и их наложение займет в целом больше времени. ИМХО новое поведение предпочтительнее старшего.

0 голосов
/ 30 января 2020

Я бы порекомендовал вам взглянуть на документацию Транзакции и пакетные записи . В этой документации вы сможете найти больше информации и примеров о том, как выполнять транзакции с Firestore.

В ней вы найдете дополнительные пояснения по get(), set(), update() и delete() операций.

Я могу выделить из документации для вас следующее, что очень важно для вас заметить при работе с транзакциями:

  • Операции чтения должны предшествовать записи операции.
  • Функция, вызывающая транзакцию (функция транзакции), может запускаться более одного раза, если одновременное редактирование влияет на документ, который читает транзакция.
  • Функции транзакции не должны напрямую изменять состояние приложения.
  • Транзакции не будут выполнены, когда клиент находится в автономном режиме.

Дайте мне знать, помогла ли вам информация!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...