2

例如:

SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction ROLLING BACK

我从代码中抛出的 PDOEception 中收到此消息。我想截取错误代码(1213)并对其进行具体处理。

为什么?
例如死锁意味着我只需要在一微秒左右后重新提交查询。其他错误,意味着我需要提醒开发人员等)。

现在我必须编码(在继承的类中PDO):

    try{
        $this->lastStatement = $sql;
        $this->lastStatement->execute($params);
    }catch (PDOException $e){
        return $this->error($e);
    }

我不能使用getCodeof,$E因为它似乎没有 MySQL 的全部错误范围。例如,下面的错误:SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction 将返回HY000这是一个非常通用的代码。用于许多不同的错误类型。

我应该解析错误消息吗?

4

3 回答 3

2
$e->getCode();

它包含 SQLSTATE 代码,其中的40001意思是“死锁”。

于 2012-11-14T16:55:59.837 回答
0

现在,我看到的唯一选择是解析错误消息本身并提取四位数的错误代码。

$s='SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction';
$p='/\b[0-9]+/';
preg_match($p,$s,$m);
var_dump($m);
于 2012-11-14T17:17:54.510 回答
0

PDO 语句有一个函数 ->errorInfo(),它返回一个有用信息的数组 - 检查 $err[2] 其中 $err 是从上述函数返回的数组。

http://php.net/manual/en/pdo.errorinfo.php

于 2013-09-03T14:31:16.077 回答