На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Внимательно изучите правила раздела перед созданием темы
0. ПРИЛАГАЙТЕ СВОИ СКРИПТЫ.
1. Прежде чем создать топик, используйте поиск. Возможно это уже обсуждалось.
2. В топике указывайте ОС, режим работы скрипта (CLI|CGI). Очень желателен вывод лог-файлов и того места, куда у вас назначен вывод данных (STDOUT|STDERR)
3. Помните: вы знаете что вы хотите, а форумчане - нет. Поэтому следуйте простому правилу: грамотный развернутый вопрос - грамотный развернутый ответ.
Модераторы: ANDLL
  
    > Проблема блокировки DBM файла в Perl
      Здравствуйте, коллеги!

      Для монопольной блокировки DBM файлов до настоящего
      времени я пользовался известным "классическим" приемом,
      основанным на flock() и предлагаемым в различной литературе
      (в том числе в книгах Camel book и Perl Cookbook):

      use MLDBM qw(DB_File);
      use Fcntl qw(:DEFAULT :flock);
      ...
      $db=tie(\%db, 'MLDBM', $file, O_RDWR) || die $!;
      $fd=$db->fd;
      open(DB_FH, "+<&=$fd") || die $!;
      flock (DB_FH, LOCK_EX) || die $!;
      $db{$key}=$reference;
      $db->sync;
      undef $db;
      untie \%db;
      close(DB_FH);
      ...

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

      1) В документации к модулю DB_File указывается, что
      применение приведенного подхода с версиями до 1.72
      этого модуля может приводить к нарушению целостности
      базы данных. Предлагается вовсе отказаться от flock()
      и воспользоваться модулями Tie::DB_Lock, Tie::DB_LockFile
      или DB_File::Lock.

      2) В документации к mod_perl в разделе "mod_perl and dbm files"
      (http://perl.apache.org/docs/1.0/guide/dbm.html) более
      детально обсуждается эта проблема и прямо говорится:
      "The suggested locking methods in the Camel book
      and DB_File man page (before version 1.72, fixed in 1.73)
      are flawed."
        Там же наряду с Tie::DB_Lock, Tie::DB_LockFile,
      DB_File::Lock и DB_File::Lock2 рассматриваются в том числе
      и такие варианты решения проблемы блокировки:

      Similar for the exclusive (EX), write access:

      flock FLOCK_EX <===== start critical section
      tie()
      write...
      sync()
      untie()
      flock FLOCK_UN <===== end critical section

      3) Для модуля MLDBM, который я использую, также
      разработан модуль MLDBM::Sync для решения вопроса
      блокировки DBM файлов.

      В связи со всем этим у меня остаются такие вопросы:

      - будет ли корректно работать приведенный мной
      "классический" (основанный на flock() ) подход к
      блокировке DBM файлов с версиями модуля DB_File старше
      1.72 (например, у меня установлена 1.801)?;

      - будет ли этот подход корректно работать в моем случае,
      то есть при использовании модуля MLDBM qw(DB_File)
      (версия модуля 2.0)?;

      - насколько жизнеспособен вариант блокировки, описанный
      в 2), когда flock() стоит перед tie()?;

      - действительно ли, если возможно, стоит совсем
      отказаться от вариантов с flock() и использовать упомянутые
      новые модули для решения проблем блокировки?


      Отзовитесь, pls, кто сталкивался с этими вопросами.

      Спасибо!

        Под какой Осью код работает, если под линухой, то не знаю. Если под виндой, то там в документации по перлу есть указание, что блокировка вообще не возможна. Правда не знаю под какой версией винды, может ошибаюсь
          OC - Linux.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0201 ]   [ 15 queries used ]   [ Generated: 27.04.24, 06:09 GMT ]