Попытаюсь объяснить:
Моделируем ситуацию, когда к одному и тому же значению в базе одновременно обращаются несколько клиентов с целью редактирования его. Например клиент №1 читает значение , обрабатывает его и записывает результат в базу, но в момент обработки клиентом №1, клиент №2 тоже считал, обработал, и уже записал свой результат (по каким либо причинам №2 сделал это на порядок быстрей №1, возможно выполнив процедуру над этими данными отличной от процедуры, которую выполнял клиент №1). Получается клиент №1 проигнорировал результат полученный и записанный клиентом №2, и перезаписал его своим, т.к. входящим значением для него было значение еще не измененное клиентом №2.
Но если арма выполняет все операции из очереди, то проблем нет ваапще, такое обращение к источнику вроде как гарантирует актуальность данных.
Просто в миссии над которой я работаю (пытаюсь работать), очень много общих значений динамически изменяемых (возможно несколькими, одновременно) клиентами. Но "возможно несколькими, одновременно" - получается, что невозможно
.
Я правильно понял вас: все операции на сервере выполняются строго из сформированной очереди, последовательно и можно не париться?
Давайте пристальнее посмотрим на команду
Какова суть этой команды? Правильно, вызывать исполняемый код, на предмет обработки нового значения, при изменении значения некой глобальной, публичной переменной.
Что из этого следует, движок просто обязан планировать это событие, и планирует, ибо несколько клиентов могут, и вполне реально, исполнить запрос на изменение значения переменной. И самое главное, кто раньше встал, тому и тапки.
// При инициализации сервера, в неком месте CostCondom = 1; // 1 тугрик publicVariable "CostCondom"; "CostCondom" addPublicVariableEventHandler { _newCost = _this select 1; /* производим запись новой стоимости презерватива в любой выбранный вами тип бызы данных */ }; // На клиентах if (isNil "CostCondom") then { hintSilent "Стоимость презервативов не определена. Приносим извинения за не удобство."; } else { _costCondom = CostCondom; _newCostCondom = _costCondom * 2; // вычисляется новая стоимость CostCondom = _newCostCondom; publicVariableServer "CostCondom"; // новое значение стоимости отправляется серверу };
Но самый разумный, и более правильный способ определять текущую стоимость, предоставить серверу, а с клиентов передавать некий набор данных, опираясь на которые сервер и будет определять текущую стоимость.
Сообщение отредактировал SteelRat: 23 December 2015 - 20:25