2013-03-01 2 views
3

Я программирую приложение C# с базой данных SQLite, я получаю сообщение: Database Locked(5) в моем журнале вывода иногда. Я не хочу, чтобы это произошло, я знаю, что несколько действий, выполняемых в моей базе данных, дают мне это исключение.Блокировка базы данных Sqlite multiple Threads

Вопрос:

Есть ли способ, чтобы увидеть, если SQLiteDatabase занят обработкой других запросов?

ответ

2

Если вы создаете многопоточное приложение, наличие знаний, которые вы просите, не решит никаких проблем. Они могут заставить их появляться реже, но иногда вы увидите ту же проблему, что и раньше.

Почему? Потому что с момента, когда вы спрашиваете: «Вы заблокированы?» к моменту, когда вы говорите «в таком случае, позвольте мне заблокировать вас, чтобы что-то сделать», другой поток, возможно, вскочил и заблокировал его.

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

Кроме того, поскольку SQLite по сути является однопользовательским (а не пользователем, как у человека, а как пользователь, как в базе данных «что-то, что использует базу данных»), вы можете подумать, что это не становится неправильным инструментом для работа.

+0

Спасибо за ваш ответ, нет, это почти идеальная база данных для моего приложения, я думаю, мне нужно использовать bool для проверки того, что-то только пытается отправить запрос в базу данных, и в настоящий момент это так, Я мог бы использовать этот bool, чтобы другие потоки не могли отправить запрос в базу данных, одна проблема, когда в bool было установлено что-то вроде: busy = false снова, он должен немедленно выполнить «Задачи» (запрос к базе данных), когда у него есть время. Любой способ достичь этого с помощью цикла while? – Max

+0

Что вы ищете, это Compare and Swap. C# имеет один в классе Interlocked http://msdn.microsoft.com/en-us/library/801kt583%28v=vs.110%29.aspx. Другое, что вы можете использовать, это Mutex – shimpossible

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