AQL-запрос с обновлением документов из двух коллекций выполняется как транзакция или нет? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть вопрос о транзакциях в arangodb, если я запускаю ниже AQL-запроса, он будет выполнен как одна транзакция или будет разделен на две транзакции?Мой бэкэнд - php:

LET r1 = (FOR u IN Users UPDATE u WITH { status: "inactive" } IN Users)
LET r2 = (FOR b IN Blogs UPDATE b WITH { status: "inactive" } IN Blogs)
RETURN true

Пока я использую транзакцию, как предлагает документация arangodb (с использованием кода javascript), но если возможно использование AQL-запроса, я бы предпочел удалить код js из моего кода php!

Если это возможно, вы предлагаете это решение для совершения транзакций или предпочитаете использовать js?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

AQL в среде с одним сервером выполняется в режиме ACID.Это происходит автоматически в рамках одной транзакции без дальнейшей необходимости в отдельном _executeTransaction.Поэтому вы можете использовать приведенный выше оператор AQL для обновления двух коллекций в одном операторе AQL.

Следует помнить о некоторых оговорках:

  • после оператора обновления для коллекциивы не можете использовать эту конкретную коллекцию в любом последующем обновлении или операторе чтения
  • , если вы включите промежуточные фиксации, тогда обновление больше не будет атомарным
0 голосов
/ 22 февраля 2019

(отредактировано из оригинала)

Согласно документации:

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

Чтобы инициировать транзакцию, вам нужно сделать это явно .

В ArangoDB нет отдельных команд транзакций BEGIN, COMMIT или ROLLBACK.Вместо этого транзакция в ArangoDB запускается путем предоставления описания транзакции функции JavaScript db._executeTransaction:

db._executeTransaction(description);

Например:

db._executeTransaction({
  collections: {
    write: [ "users", "logins" ],
    read: [ "recommendations" ]
  }
});

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

При этом основное преимущество баз данных документов / графиков заключается в возможности горизонтального масштабирования, сегментирования и кластеризации.,Если вам абсолютно необходимо полагаться на транзакции, вы можете переосмыслить, почему вы используете базу данных на основе документов. Возможная согласованность обычно достаточно для многих случаев использования, но в других случаях вам абсолютно необходимо ACID .Блог , вероятно, не нуждается в ACID.

...