Запрос AQL с обновлением документов из двух коллекций выполняется как транзакция или нет?

У меня вопрос о транзакциях в 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-способа предпочтительнее?


person Amirreza Shafaat    schedule 22.02.2019    source источник


Ответы (2)


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

Следует иметь в виду следующее:

  • после оператора обновления для коллекции вы не можете использовать эту конкретную коллекцию в любом дальнейшем операторе обновления или чтения
  • если вы включите промежуточные коммиты, то обновление больше не будет атомарным
person Frank Celler    schedule 25.02.2019
comment
спасибо за ответ, это было очень полезно. Я использую RocksDB, но не знаю, включена ли промежуточная фиксация или нет. как я могу это проверить? - person Amirreza Shafaat; 26.02.2019
comment
Фрэнк, не могли бы вы указать мне на документы / ссылку для этого? Я не знал, что среда с одним сервером действует по-разному. Хорошо знать. - person Andrew Grothe; 27.02.2019
comment
Документация docs.arangodb.com/3.4/AQL/Operations/Insert.html, и этот параметр описан в docs.arangodb. ru / 3.4 / Руководство / Программы / Arangod / - person Frank Celler; 20.03.2019

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

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

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

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

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

db._executeTransaction(description);

Например:

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

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

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

person Andrew Grothe    schedule 22.02.2019
comment
Я хочу указать на важное слово в строке 2 того, что вы упомянули: ... один оператор UPDATE для каждой коллекции разрешен для каждого запроса AQL ... поэтому в моем случае, поскольку обновления влияют на две разные коллекции, я не вижу проблем, но я не могу быть в этом уверен! - person Amirreza Shafaat; 23.02.2019
comment
@AmirrezaShafaat Я понимаю вашу точку зрения, я интерпретировал ее по-другому. - person Andrew Grothe; 23.02.2019
comment
@AmirrezaShafaat нашел дополнительную информацию о транзакциях и обновил ответ. - person Andrew Grothe; 23.02.2019
comment
Я хотел указать и подчеркнуть то, что @AndrewGrothe сказал о конечной согласованности. ACID - это дорого, очень дорого, и если вам нужно много одновременных транзакций, вы получите много конфликтов записи-записи с ArangoDB, и производительность сильно упадет. Сделайте себе одолжение и используйте БД с возможной согласованностью, если вы можете с ней жить. - person Oliver Hausler; 03.06.2021