file Alt ←

Статический метод :lock

Эксклюзивное выполнение кода.

^file:lock[имя_файла_блокировки]{код}

Метод гарантирует, что код не будет выполняться параллельно в разных процессах, для обеспечения эксклюзивности используется файл блокировки.

Пример

^file:lock[/counter.lock]{
	$file[^file::load[text;/counter.txt]]
	$string[^eval($file.text+1)]
	^string.save[/counter.txt]
}

Количество посещений: $string<br>

В отсутствие блокировки два одновременных обращения к странице могли вызвать увеличение счетчика на 1, а не на 2:

  • пришел первый;
  • пришел второй;
  • считал первый, значение счетчика 0;
  • считал второй, значение счетчика 0;
  • увеличил первый, значение счетчика 1;
  • увеличил второй, значение счетчика 1;
  • записал первый, значение счетчика 1;
  • записал второй поверх только что записанного первым, значение счетчика 1, а не 2.
Всегда следует помнить об одновременно приходящих запросах. При работе с базами данных обычно есть встроенные в SQL-сервер средства для их корректной обработки.

При использовании более одной блокировки всегда нужно думать об их взаимном сочетании, чтобы избежать ситуации «А ждет Б, Б ждет А», так называемого deadlock.