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.