2015-10-15 2 views
3

По-видимому, мутации graphQL выполняются последовательно по очереди.транзакция с несколькими мутациями GraphQL

Источник:

В GraphQL мутации выполнены в виде последовательности. В противном случае трудно определить ошибки, такие как добавление одного и того же автора снова и снова.

Это полностью зависит от реализации сервера GraphQL для реализации таких мутаций . Реализация NodeJS и другие реализации сообщества для Python и Scala следуют этому примеру.

Если я правильно понимаю, это это предотвратить:

  • выполнения запросов параллельно
  • использование операций над несколькими запросами

Какова Обоснованием этого дизайнерское решение? Существуют ли другие проекты, которые делают это по-другому?

ответ

4

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

Важно отметить разницу между мутациями и запросами, особенно в отношении параллелизма.

Также важно отметить, что GraphQL ничего не говорит о том, как изменения применяются вне одного запроса. Это ваша абстракция кода, вы решаете, использовать ли SQL begin ... commit, чтобы блокировать запись базы данных или просто делать вызовы обновления напрямую и откатывать кости.

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

В SQL мутации часто заключаются в скобки между BEGIN и COMMIT. В Redis блок MULTI EXEC предлагает эту функциональность.

Это прежде всего то, что я видел. Тем не менее, неупорядоченная параллельная обработка редактирования, безусловно, возможна, если вы убедитесь, что результаты независимы от пути, и вы можете найти способ гарантировать сохранение всех свойств ACID.

Есть способы сделать это на многих языках, но я могу только подумать о примере реализации этого в Redis с головы.

Вы можете сопоставить изменения с набором коротких сценариев Lua, которые проверяют значение ключа транзакции для своих сериализованных себя, и если они найдут совпадение, они вернутся перед применением. В противном случае они применили бы редактирование и добавили сериализованное редактирование в тело транзакции.

ПРИМЕЧАНИЕ. Если у вас есть зависимые изменения (Create table, push entry to table), вы можете действительно стрелять в ногу, избегая серийного редактирования.

Что касается транзакций по нескольким запросам? Я никогда их не использовал, и эта тема больше подходит для этого вопроса.

Multi-step database transaction split across multiple HTTP requests