On Fri, Apr 27, 2007 at 03:38:52PM +0500, Sergey Y. Afonin wrote: > On Friday 27 April 2007, Alexey Tourbin wrote: > > > DB_INIT_CDB дает "прозрачный" локинг для каждой операции. > > То есто операция начинается берётся блокировка. Операция заканчивает > > блокировка снимается. > > > > DB_INIT_LOCK по идее специально указывать не надо, если указано > > DB_INIT_CDB|DB_INIT_MPOOL. > > > > Там есть ещё другой режим вместо локинга, он log может писать. > > Но этот другой режим - тоже режим блокировок ? Хочется понять, почему > сейчас работает, когда нет явного указания на использование блокировок. > Обязательно уже должно было несколько процессов к одной базе сунуться > и не раз. Ан нет, пашет... Скорее всего, не работает. Просто если чтение с записью не пересекается, то это, может быть, прокатывает. Ну или там один в базу записал а другой старую копию базы видит, и это работает, пока постраничные данные не перезаписаны. Режима два разных: либо блокировать всю базу (ну или там постранично), либо писать write-ahead log (это транзакции, там сложнее уже). Либо блокировать своими средствами. Делайте как у меня, лучше пока ничего не придумано. :) Похожим образом сделано в /usr/sbin/amavisd, только там BerkeleyDB::Env->new ничем не блокируется. По-моему при одновременных попытках инициализировать evn будет капут. При использовании логинкга или DB_INIT_CDB очень важно сигналы правильно заблокировать. /usr/share/doc/db-4.4.20/ref/program/appsignals.html К сожалению в перле это делается проще чем в C.