На самом деле 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