繁体   English   中英

PDO交易中出现意外结果

[英]Unexpected results in PDO Transactions

我的问题有点简单,或者从我这方面可能是一个愚蠢的错误。 但是我不知道在php中使用PDO时会得到意想不到的结果。

代码是这样的,

try
{
    $_pdo = get_pdo_instance();

    $_pdo->beginTransaction();

    //query 1
    $_pdo->query("some query"); // I have error in query 3 but this query 1 is still executed.

    //query 2
    $_pdo->query("some query"); // only executes when there are no errors.

    //query 3
    $_pdo->query("some wrong query"); // let's say I have an error in this sql

    $_pdo->commit();

}
catch(Exception $ex)
{
    $_pdo->rollback();
}

我现在正在解释问题,在给定的示例中, query 3存在一些sql错误,因此查询都不应运行,因为它们都属于单个事务。

但是在我的情况下,即使该try块中有错误, query 1始终会运行。

也许这很简单,但我不知道为什么会这样。

编辑:函数定义,

function get_pdo_instance()
{
    try 
    {
        $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } 
    catch(PDOException $e) 
    {
        die('ERROR: ' . $e->getMessage());
    }

    return $conn;
}

异常仅用于PHP错误。 在上面的代码中,您尝试捕获MySQL错误。 当PHP读取您的try块时,一切看起来都很好,因此也没有异常可以捕获。 您可以使用PDO和MySQL进行错误检查,例如:

if(!$_pdo->query("some query")) {
// Do something
}

请参阅PDO错误处理的文档。 您需要打开异常引发。

try {
  $_pdo = get_pdo_instance();
  $_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $_pdo->beginTransaction();
  $_pdo->query("some query");
  $_pdo->query("some query");
  $_pdo->query("some wrong query");
  $_pdo->commit();
}
catch(Exception $ex) {
  $_pdo->rollback();
}

这是我的解决方案,

我正在捕获Exception ,但是在这种情况下,我必须捕获PDOException

我想这解决了我的问题,但是我还没有完全测试过这个东西。 我将发布更新(如果有)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM