Режимы Sqlite-потоков и парадокс неправильного использования sqlite - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть проект, в котором я должен использовать несколько таблиц, чтобы избежать дублирования данных в моем файле sqlite (хотя я знал, что использование нескольких таблиц было кошмаром).

В моем приложении я читаю данные из одноготаблица в каком-то методе и вставка данных в другую таблицу в другом методе.Когда я делаю это, я получаю из функции шага sqlite код ошибки 21, который является неправильным использованием sqlite.

Согласно моим исследованиям, это связано с тем, что я не смог получить доступ к таблицам из многопоточности.

До сих пор я читал сайт sqlite и узнал, что есть 3 режима для настройки базы данных sqlite:

1) singlethread: у вас нет шансов вызвать несколько потоков.
2) многопоточность: да многопоточность;но есть некоторые препятствия.
3) сериализация: это лучшее соответствие многопоточным приложениям баз данных.

если sqlite3_threadsafe() == 2 возвращает значение true, тогда да, ваша база данных sqlite сериализована, и это вернуло значение true, поэтому я доказалэто для меня.

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

sqlite3_config(SQLITE_CONFIG_SERIALIZED);

когда я использую вышеуказанные коды в классе, где я читаю и вставляю данныес 1 стола работает отлично :).Но если я пытаюсь использовать его в классе, где я читаю и вставляю данные из 2 таблиц (на самом деле, там, где мне это действительно нужно), возникает проблема неправильного использования sqlite.

Я проверил свой код, где я открываю и закрываю базу данных, тамс ними проблем нет.они работают, если я не удаляю другие.

Я использую ios5, и это действительно большая проблема для моего проекта.Я слышал, что Instagram использует Postgresql, может быть, это была причина, ха?Вы бы сначала предложили postgresql или sqlite?

1 Ответ

2 голосов
/ 26 февраля 2012

Мне кажется, что вы перепутали две вещи.

Один против многопоточных

Однопоточные сборки безопасны для использования только из одного потока вашего кода, поскольку в них отсутствуют механизмы (мьютексы, критические секции и т. Д.), Которые позволяют безопасно использовать несколько. Если вы используете несколько потоков, используйте многопоточную сборку (или ожидайте «интересную» проблему; вы были предупреждены ).

Поддержка потоков SQLite довольно проста. В многопоточной сборке определенные соединения должны использоваться только из одного потока (за исключением того, что они могут быть первоначально открыты в другом).

Все последние (последние несколько лет?) Сборки SQLite довольны доступом к одной базе данных из нескольких процессов , но степень параллелизма зависит от…

Тип транзакции

SQL в целом поддерживает несколько типов транзакций. SQLite поддерживает только их подмножество, и по умолчанию это SERIALIZABLE. Это самый безопасный режим доступа; он имитирует то, что вы бы увидели, если бы только одна вещь могла происходить одновременно. (Внутренне, он реализован с использованием схемы, которая позволяет сразу нескольким читателям, но только одному писателю; есть некоторая хитрость, чтобы не дать кому-то еще голодать.)

SQLite также поддерживает незафиксированные транзакции для чтения. Это увеличивает количество параллелизма, доступного для кода, но рискует читателям увидеть информацию, которая еще не гарантирована. Имеет ли это значение для вас, зависит от вашего заявления.

...