2010-11-11 4 views
3

У меня есть 2 процесса, которые имеют доступ к базе данных sqlite3. Хотя чтение не является проблемой в sqlite, только один процесс может записывать в базу данных. По данным faq: http://www.sqlite.org/faq.html#q5 sqlite использует блоки чтения/записи.sqlite: проверка блокировки чтения/записи

Как проверить, заблокирована ли база данных для записи другим процессом, как из python, так и из C++?

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

ответ

2

Когда SQLite пытается получить доступ к заблокированной базе данных, по умолчанию поведение должно возвращать SQLITE_BUSY. В документации описаны способы добавления пользовательской обработки к этому событию: http://www.sqlite.org/faq.html#q5.

Я понимаю из документации, что любая функция, которую вы вызываете, которая пытается записать в эту заблокированную базу данных, просто вернет SQLITE_BUSY, и это будет ваше уведомление о том, что база данных заблокирована.

Если вы беспокоитесь о выполнении записи, которая не будет выполнена, вы можете реализовать обратный вызов занятого обработчика (sqlite3_busy_handler) в сочетании с таймаутом занятости (sqlite3_busy_timeout), который повторит запись после x миллисекунд.

[править] В http://www.sqlite.org/c3ref/io_methods.html, он упоминает-структуру указателей на функции, одна из которых является xCheckReservedLock(), который возвращает истину, если файл заблокирован. В этой структуре все остальные функции, связанные с блокировкой. Я не уверен в доступе к ним из-за пределов библиотеки sqlite, но это может стоить исследовать. Я думаю, что вы делаете это через этот интерфейс: http://www.sqlite.org/c3ref/file_control.html

+0

Я действительно связался с faq в моем вопросе. Дело в том, что мне хотелось бы знать, как проверить, заблокирована ли база данных. Я имею в виду, что выполнение запроса является опцией, но в зависимости от запроса требуется производительность. Поэтому вопрос заключается в том, какой тип запроса я использую для минимизации этого эффекта. Я также хотел бы заблокировать/разблокировать базу данных самостоятельно. Вероятно, я должен был быть более ясным в вопросе. –

+0

В http://www.sqlite.org/c3ref/io_methods.html упоминается структура указателей функций, одна из которых - xCheckReservedLock(), которая возвращает true, если файл заблокирован. В этой структуре все остальные функции, связанные с блокировкой. Я не уверен в доступе к ним из-за пределов библиотеки sqlite, но это может стоить исследовать. Я думаю, что вы делаете это через этот интерфейс: http://www.sqlite.org/c3ref/file_control.html – badgerr

+0

Я исправил проблему другим способом, поэтому я не уверен, действительно ли ваше предложение действительно работает, но вы прилагаете усилия для ответа на этот вопрос поэтому я буду отмечать его как правильное –

Смежные вопросы