zed писал(а):как там сделать многопользовательское чтение/запись в метки, нужно думать много и усердно. У тебя как это сделано?
Да в общем-то нечего там особо думать.
Чтение просто тупо напрямую. Пока продолжается чтение, за согласованность данных отвечает сам SQlite. Если снаружи удалят геометрию или чего другое, то потом просто ничего не найдётся вторичным запросом.
При записи открывается транзакция на BeginWrite и на EndWrite закрывается (в зависимости от того, летим ли с исключением или нет, будет rollback или commit), или как там называется эта пара процедур для блокировки.
То есть, как бы ничего специального для этого я и не делал.
Но база открывается не эксклюзивно, а как проходной двор.
Вот настройки открытия базы:
PRAGMA page_size=1024
;
PRAGMA cache_size=100000
;
PRAGMA main.journal_mode=WAL
;
PRAGMA synchronous=NORMAL
;
В принципе, скорее всего не включён journal_mode=WAL, а без него скорее всего никак не взлетит параллельная работа.
Проблема ещё может быть в том, что разные сборки SQLite по-разному ведут себя в случае многопоточности.
Для некоторых можно вообще ничего не лочить, всё само строем полетит в базу.
См. опцию SQLITE_THREADSAFE
http://sqlite.org/compile.html#debug
Сейчас подумалось, что надо будет переделать кэш в памяти (тайловый в хранилищах и даже может быть кэш категорий в метках) на SQlite или беркли, если там есть что-то типа :memory:
Ща тикет нарисую.