2013-11-25 3 views
3

Я управляю пулом сеанса без состояния для веб-сервиса между пользователями.
Поэтому, когда пользователь запрашивает веб-службу, он начинает сеанс, а время ответа составляет 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 секунд, я обновляю базу данных.

+1

Код, пожалуйста? В этом слишком мало деталей, чтобы получить правильный ответ. Покажите нам, что вы пробовали, и где проблема. – Namphibian

+0

код предоставлен .. проблема в том, что пользователь A выбирает один сеанс и перед обновлением его lastqueryDatetime, другой пользователь выбирает один и тот же сеанс и, в конечном итоге, отказывается от webservices –

+0

Хорошее редактирование. Это более заслуживает ответа. –

ответ

0

Открытая сделка. Выполните запрос «select ... for update» для получения данных сеанса. Зафиксировать транзакцию в конце скрипта.

 Смежные вопросы

  • Нет связанных вопросов^_^