Spec-Zone.ru › DuckDB

Конкурентность

Обработка конкурентности

DuckDB имеет две настраиваемые опции для конкурентности:

  1. Один процесс может как читать, так и записывать в базу данных.
  2. Несколько процессов могут читать из базы данных, но ни один процесс не может писать (access_mode = 'READ_ONLY').

При использовании опции 1, DuckDB поддерживает несколько потоков записи, используя комбинацию MVCC (Управление конкурентностью с множественными версиями) и оптимистического управления конкурентностью (см. Конкурентность в пределах одного процесса), но всё внутри этого одного процесса записи. Причина этой модели конкурентности заключается в возможности кеширования данных в оперативной памяти для ускорения аналитических запросов, вместо постоянного обращения к диску при каждом запросе. Она также позволяет кешировать указатели функций, каталог базы данных и другие элементы, чтобы последующие запросы к одному соединению были быстрее.

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

Конкурентность в пределах одного процесса

DuckDB поддерживает конкурентность в пределах одного процесса в соответствии со следующими правилами. Пока нет конфликтов при записи, несколько одновременных записей будут успешны. Дополнения никогда не конфликтуют, даже в одной и той же таблице. Несколько потоков также могут одновременно обновлять отдельные таблицы или отдельные подмножества одной таблицы. Оптимистическое управление конкурентностью вступает в силу, когда два потока пытаются редактировать (обновить или удалить) одну и ту же строку одновременно. В этой ситуации второй поток, пытающийся произвести редактирование, потерпит неудачу с ошибкой конфликта.

Запись в DuckDB из нескольких процессов

Автоматическая поддержка записи в DuckDB из нескольких процессов не предусмотрена и не является основной целью проектирования (см. Обработка конкурентности).

Если нескольким процессам необходимо писать в один и тот же файл, возможны несколько шаблонов проектирования, но их необходимо реализовать в прикладной логике. Например, каждый процесс может получить блокировку взаимного исключения для межпроцессного доступа, затем открыть базу данных в режиме чтения/записи и закрыть её по завершении запроса. Вместо использования блокировки взаимного исключения, каждый процесс может повторно пытаться подключиться, если другой процесс уже подключен к базе данных (не забывая закрыть соединение по завершении запроса). Другой вариант — выполнение многопроцессных транзакций в базе данных MySQL, PostgreSQL или SQLite и использование расширений DuckDB для MySQL, PostgreSQL или SQLite для периодического выполнения аналитических запросов к этим данным.

Дополнительные варианты включают запись данных в файлы Parquet и использование возможностей DuckDB по чтению нескольких файлов Parquet, аналогичный подход к файлам CSV или создание веб-сервера для обработки запросов и управления чтением и записью в DuckDB.

Оптимистическое управление конкурентностью

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

Transaction conflict: cannot update a table that has been altered!

Подсказка. Обходным решением при возникновении конфликта транзакций часто является повторное выполнение транзакции.

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/connect/concurrency.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API