Вот такой вопрос: как наиболее правильно сделать, чтобы 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 не сможет обратиться.





