Я занимаюсь программированием баз данных, используя Java с SQLite.
Я обнаружил, что только одно соединение одновременно с базой данных имеет возможность записи, в то время как многие соединения одновременно имеют возможность чтения.
Почему архитектура SQLite была разработана таким образом? Пока две записываемые вещи не записываются в одно и то же место в базе данных, почему две записи не могут происходить одновременно?
database
concurrency
sqlite
Стальной подносок
источник
источник
Ответы:
Поскольку «множественные одновременные записи» гораздо, намного сложнее выполнить в ядре базы данных, чем в режиме «один-пишущий-несколько-читатель». Это выходит за рамки параметров проектирования SQLite, и его включение, вероятно, подорвет восхитительно небольшой размер и простоту SQLite.
Поддержка высокой степени параллелизма записи является отличительной чертой таких больших баз данных, как DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL и Sybase. Но это технически сложно осуществить, требуя обширных стратегий управления и оптимизации параллелизма, таких как блокировка базы данных, таблицы и строки или, в более современных реализациях, управление многовариантным параллелизмом . Исследования по этой проблеме / требованию обширны и уходят вглубь десятилетий .
У SQLite совершенно иная философия проектирования, чем у большинства тех серверно-ориентированных СУБД, которые поддерживают несколько программ записи. Он предназначен для того, чтобы передать возможности SQL и реляционной модели отдельным приложениям и, в действительности, быть встраиваемым в каждое приложение. Эта цель требует значительных компромиссов. Не добавление значительной инфраструктуры и накладных расходов, необходимых для обработки нескольких одновременно работающих авторов, является одним из них.
Философия может быть подытожена утверждением на соответствующей странице использования SQLite :
источник
fopen()
, поэтому рассмотрим все проблемы, которые возникают при одновременной записи в простой текстовый файл.Потому что нет сервера, который мог бы сказать, должны ли вещи быть записаны в то же место или нет. Есть только два процесса, пытающихся записать в файл.
Как указано в комментарии, одновременная запись также может поддерживаться внутренним потоком. Не уверен, насколько хорошо это будет работать (не думал об этом тоже). В любом случае, вот почему SQLite не использует потоки: доктор Хипп считает, что потоки - это зло.
Тот факт, что DR Hipp считает потоки злыми, задокументирован в FAQ по SQLite .
источник