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.


Copyright © 1997–2024 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 20.05.2024