gpt4 book ai didi

php - 在 select 上锁定 mysql 数据库表行

转载 作者:搜寻专家 更新时间:2023-10-31 22:05:05 25 4
gpt4 key购买 nike

我正在为用户之间的 Web 服务管理一个无状态 session 池。
因此,当用户请求 Web 服务时,他会启动 session 并且响应超时为 5 秒,因此他最多可以保持 session 5 秒。第二个用户进来,系统检查是否有可用 session 然后使用它。

现在我这里有一个问题。当假设有一个 session 可用时,用户 A 来了,系统检查它是否在 5 秒前使用过,给用户 A,同时另一个用户点击并系统检查 session 是否在 4 秒前使用过,分配给用户B。
现在,使用相同 session 和系统的用户都在一个上失败了。

我也试过选择更新命令来锁定它。
我已经尝试在第一个用户选择后立即更新上次使用时间,但这没有用(我认为第二个用户同时点击系统)
有人可以就此提出建议吗。

代码:检查来自数据库的 session (如果可用)然后选择它或插入一个新的

//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;

}
}

检查数据库中 session 可用性的函数:

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;
}

只要我发现一个 session 闲置超过 5 秒,我就会更新数据库。

最佳答案

打开交易。发出“select ... for update”查询以获取 session 数据。在脚本末尾提交事务。

关于php - 在 select 上锁定 mysql 数据库表行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20204769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com