Вот такой вопрос: как наиболее правильно сделать, чтобы CGI, обращающийся к БД, которую уже открыл кто-то другой, ожидал, пока база не будет разблокирована?
Сейчас делаю так:
try_exec:
rc = sqlite3_exec(db, q_str, callback, NULL, &zErrMsg);
if(rc){
if((rc == SQLITE_BUSY || rc == SQLITE_LOCKED) && Ntry < Ntry_max){ // база заблокирована другим вызовом
Ntry++;
DBG("ooops, DB is busy, try number %d", Ntry);
usleep(50); // ждем .05с
goto try_exec; // пробуем снова
}
fprintf(stderr, "SQL error: %s, %d\n", zErrMsg, rc);
die(SQL_ERR);
}
Но пока к базе обращаются одновременно 2-3 клиента, все ОК, если же клиентов будет очень много, такой способ может привести к длительному ожиданию (смотря какое ограничение на Ntry_max поставить), в конце которого все равно к базе данных CGI не сможет обратиться.