Серверный JavaScript 1.4. Руководство по использованию




Исключение Мёртвой Блокировки/Deadlock


Вы используете замки для защиты критичных участков кода. На практике это означает, что один запрос ожидает, пока другой выполняет критичный код. Вы обязаны соблюдать осторожность при использовании замков для защиты критичных разделов. Если один запрос ожидает освобождения замка, полученного другим запросом, а этот второй запрос ожидает освобождения замка, полученного первым запросом, ни один из запросов не сможет продолжить работу. Эта ситуация называется deadlock/тупик/мертвая блокировка.

Рассмотрим предыдущий пример обработки заказов потребителей. Предположим, что приложение разрешает два действия. В одном - пользователь вводит нового потребителя; в другом - пользователь вводит новый заказ. Как часть создания нового потребителя приложение также создаёт новый заказ потребителя. Это действие выполняется на одной странице приложения, давая примерно такой код:

// Создать нового потребителя (customer).


if ( project.customersLock.lock() ) {

   var id = project.customers.ID;

   id = id + 1;
   project.customers.ID = id;

   // Стартовать новый заказ (order) для этого нового потребителя.

   if ( project.ordersLock.lock() ) {

      var c = project.orders.count;

      c = c + 1;

      project.orders.count = c;

      project.ordersLock.unlock();
   }

   project.customersLock.unlock();
}

Во втором типе действия пользователь вводит новый заказ потребителя. Как часть процесса ввода нового заказа: если потребитель ещё не является зарегистрированным потребителем, приложение создаёт нового потребителя. Это действие выполняется на другой странице приложения, где может быть примерно такой код:

// Стартовать новый заказ.


if ( project.ordersLock.lock() ) {

   var c = project.orders.count;
   c = c + 1;

   project.orders.count = c;




Содержание  Назад  Вперед