Я управляю пулом сеанса без состояния для веб-сервиса между пользователями.
Поэтому, когда пользователь запрашивает веб-службу, он начинает сеанс, а время ответа составляет 5 секунд, поэтому он может удерживать сеанс максимум 5 секунд. второй пользователь приходит и проверяет систему, если есть доступная сессия, а затем ее использовать.lock mysql database table row on select
Теперь у меня есть проблема. когда можно сказать, что есть доступная сессия, приходит пользователь A, проверьте систему, если она была использована более 5 секунд назад, предоставленная пользователю A, в то же время другой пользовательский хит и проверка системы, если сеанс использовался более 4 секунд назад, назначено пользователю B.
Теперь оба пользователя, использующие один и тот же сеанс, и система сбой на одном.
Я попытался выбрать команду update, а также заблокировать ее.
Я пробовал обновлять последнее использованное время, как только оно было выбрано первым пользователем, но это не сработало (я думаю, что вторая пользовательская система удара в одно и то же время)
может кто-то посоветовать.
код: проверить сессию дб при наличии затем выбрать его или вставить новую функцию
//get 25 sessions from database order by lastqueryDate
$session = $sessionObj->select('session', '*', '', 'LastQueryDate DESC', '25');
$available_session = array();
//if sessions available, get rows from getResult
if ($session) {
$session_Data = $sessionObj->getResult();
//now get session which is sitting there more than response time out
$available_session = $sessionObj->getAvailableSession($session_Data);
}
//if there is any, use it. otherwise create new session and save in database
if (!$available_session) {
$auth->securityAuthenticate();
$header = $auth->getHeaders();
$sequence = (int) $header['Session']->SequenceNumber + 1;
$values[] = $header['Session']->SessionId;
$values [] = $sequence;
$values [] = $header['Session']->SecurityToken;
$rows = "SessionID,SequenceNo,Security_token";
if ($sessionObj->insert('session', $values, $rows)) {
$available_session['Session']->SessionId = $header['Session']->SessionId;
$available_session['Session']->SequenceNumber = $sequence;
$available_session['Session']->SecurityToken = $header['Session']->SecurityToken;
}
}
, что проверить наличие сессии в БД:
public function getAvailableSession($session_data) {
$available_session = array();
foreach ($session_data as $key) {
if (!is_array($key)) {
$key = $session_data;
}
$date = date('Y-m-d h:i:s a', time());
$now = new DateTime($date);
$last_query_time = new DateTime($key['LastQueryDate']);
$dteDiff = $last_query_time->diff($now);
$difference = $dteDiff->format("%H:%I:%S");
//if response time out is smaller than session used last. then pick it.
if (RTO <= $difference) {
$available_session['Session']->SessionId = $key['SessionID'];
$available_session['Session']->SequenceNumber = $key['SequenceNo'];
$available_session['Session']->SecurityToken = $key['Security_token'];
// run update to update lastqueryDate as its default value set to current time stamp
$session_value = $key['SessionID'];
$rows['SequenceNo'] = $key['SequenceNo'];
$where[0] = "SessionID";
$where[2] = "'" . $session_value . "'";
$this->update('session', $rows, $where);
return $available_session;
}
}
return false;
}
Как только я найти сессию сидя без дела в течение более 5 секунд, я обновляю базу данных.
Код, пожалуйста? В этом слишком мало деталей, чтобы получить правильный ответ. Покажите нам, что вы пробовали, и где проблема. – Namphibian
код предоставлен .. проблема в том, что пользователь A выбирает один сеанс и перед обновлением его lastqueryDatetime, другой пользователь выбирает один и тот же сеанс и, в конечном итоге, отказывается от webservices –
Хорошее редактирование. Это более заслуживает ответа. –