加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 使用try catch的PDO事务语法

发布时间:2020-12-13 16:53:32 所属栏目:PHP教程 来源:网络整理
导读:使用PDO事务时尝试catch的原因是什么? $dbh-beginTransaction();try {} catch (Exception $e) {} 要么 try {$dbh-beginTransaction();} catch (Exception $e) {} 解决方法 现有的答案似乎表明,由于$dbh- beginTransaction()可能抛出PDOException,它应该在实
使用PDO事务时尝试catch的原因是什么?

$dbh->beginTransaction();
try {

} catch (Exception $e) {


}

要么

try {

$dbh->beginTransaction();

} catch (Exception $e) {

}

解决方法

现有的答案似乎表明,由于$dbh-> beginTransaction()可能抛出PDOException,它应该在实际事务代码的同一个try块中,但这意味着rollBack()代码本身是错误的,因为它可以在没有事务的情况下调用rollBack(),这也可能引发另一个PDOException.

正确的逻辑顺序是,在创建事务后,将要在一个事务中执行的代码放在一个catch块中.您还可以在继续之前检查beginTransaction()的返回是否为true.在调用rollback()之前,您甚至可以检查数据库会话是否在事务中.

if ($dbh->beginTransaction()) 
{
  try 
  {
    //your db code
    $dbh->commit();
  } 
  catch (Exception $ex) 
  {
    if ($dbh->inTransaction())
    {
       $dbh->rollBack();
    }        
  }
}

请记住,至少在理论上,您仍然可以从beginTransaction()和rollBack()获取异常,因此我将其放在一个单独的函数中,并将调用括在另一个try-catch块中.

您还可以冒泡出现的异常来捕获它并将所有异常记录在一个地方.但请记住,一些异常可能是数据完整性错误,例如重复键或无效外键,这不会是数据库错误,但很可能是代码中的错误.

使用这种方法,这里要记住的主要事情是两个try-catch块的目的略有不同.内部的一个纯粹是为了确保在一个事务中以原子方式执行和提交多个查询,如果发生某些事情,它们将被回滚.外部try-catch是检测错误情况并记录它,或者如果你的数据库有问题你想做什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读