我正在尝试通过增加执行成功查询的机会来改善用户体验。
有问题的查询是简单、快速的操作——例如:
$stmt = $db->prepare('SELECT val1, val2, val3 FROM table WHERE id=?');
$stmt->execute(array($someID));
...
Run Code Online (Sandbox Code Playgroud)
或者
$stmt = $db->prepare('INSERT INTO table (val1, val2, val3) VALUES (?, ?, ?)');
$stmt->execute(array($val1, $val2, $val3));
Run Code Online (Sandbox Code Playgroud)
等等。没有连接,没有大量的数据。查询需要几分之一秒。
因为它们非常快,所以我认为多次循环同一个查询是合适和安全的,如果它失败了。
就像是:
function test($someVal, $db){
$db->beginTransaction();
try{
$stmt = $db->prepare('SELECT val1, val2, val3 FROM table WHERE id=?');
$stmt->execute(array($someVal));
$result = $stmt->fetchAll();
$db->commit();
if(count($result)){
$arr = array();
$arr['val1'] = $result[0]['val1'];
$arr['val2'] = $result[0]['val2'];
$arr['val3'] = $result[0]['val3'];
}else{
return 'empty';
}
return $arr; // All went well!
}catch(Exception $e){
$db->rollBack();
// note the exception
return false;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
然后循环几次(显然不是无限期)
$i = 0;
$tmp = test($someVal, $db);
while(!$tmp){
$i++;
if($i === 3){
// report it
exit();
}
$tmp = test($someVal, $db);
}
if($tmp === 'empty'){
...
}else{
...
}
Run Code Online (Sandbox Code Playgroud)
因此,循环将尝试查询最多 3 次,等待两次初始失败。
但是,如果失败,是否值得循环?
到目前为止,根据我的经验,我从未遇到过具有正确语法、称为正确表、具有正确值的查询失败(除非有一次服务器因维护而停机)。这意味着如果查询失败,它将继续失败,因为出现问题。
但肯定有人在某个地方有一个查询失败......只是因为?连接中的打嗝、服务器重置或其他什么可能导致查询在这一秒失败,但在下一秒成功?也许第二次(或第三次)尝试提取数据就足够了......
对?... 对?
就像我说的,这些不是过于费力的查询。但是如果没有他们返回的数据,用户就无法继续进行。
完美构造的查询失败的情况是否如此罕见,以至于我只是在浪费时间和资源进行这些重复尝试?一次失败,永远失败?
我知道这取决于失败的来源,并且某些错误(即表不存在)将继续失败。我想知道是否值得额外打电话来尝试挽救其他失败?
| 归档时间: |
|
| 查看次数: |
557 次 |
| 最近记录: |