#perl #sqlite
#perl #sqlite
Вопрос:
Предположим, у меня есть два скрипта Perl, подключенных к одной и той же базе данных SQLite. Если один из скриптов выполняет запись в базу данных, а другой также пытается выполнить запись в базу данных, будет ли разорвано соединение со вторым скриптом? или его входные данные будут сохранены в каком-либо кэше SQLite, и SQLite в конечном итоге зафиксирует записи после завершения операций записи из первого скрипта?
Я не хочу, чтобы мое второе соединение со скриптом прервалось только потому, что SQLite блокирует базу данных из-за записей из первого скрипта. Это то, что произойдет, если оба скрипта будут выполнять запись в базу данных?
Спасибо
Ответ №1:
Вы не можете. SQLite не разрешает одновременные записи.
Для записи в базу данных процесс должен сначала получить ОБЩУЮ блокировку, как описано выше (возможно, откат незавершенных изменений, если есть горячий журнал). После получения ОБЩЕЙ блокировки необходимо получить ЗАРЕЗЕРВИРОВАННУЮ блокировку.
ЗАРЕЗЕРВИРОВАННАЯ блокировка означает, что процесс планирует запись в файл базы данных в какой-то момент в будущем, но в данный момент он просто читает из файла. Одновременно может быть активна только одна ЗАРЕЗЕРВИРОВАННАЯ блокировка, хотя несколько ОБЩИХ блокировок могут сосуществовать с одной ЗАРЕЗЕРВИРОВАННОЙ блокировкой. ЗАРЕЗЕРВИРОВАННЫЙ отличается от ОЖИДАЮЩИЙ тем, что новые ОБЩИЕ блокировки могут быть получены при наличии ЗАРЕЗЕРВИРОВАННОЙ блокировки.
Комментарии:
1. Если ваше приложение не находится под большой нагрузкой, простое преобразование записи в
try/catch
и повторная попытка несколько раз должны устранить все проблемы.2. Я предполагаю, что этот комментарий направлен на вопрос. В любом случае я бы предпочел синхронизировать обращения.