Статический метод :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.