0

我在几个执行我的查询的方法周围使用了 beginTransaction。但即使查询失败,它也会运行查询。有谁知道我的问题出在哪里?

我将干出我的代码只是为了展示基础知识:

方法:

public function __construct() 
    {
        $this->core = db_core::getInstance();
    }

function handle_item($action, $item_id) 
    {
        switch($action) {
        case 'add':
            $this->core->conn->query("INSERT INTO ....");
            break;

        case 'remove':
            $this->core->conn->query("DELETE FROM ....");
            break;
        }
    }

开始交易

try 
    {
    $this->core->conn->beginTransaction();

    $this->handle_item("remove", $item_id);
    $this->handle_item("add", $item_id);

    $this->core->conn->commit();

    catch (PDOException $e) 
    {
    $this->core->conn->rollBack();
    echo $e->getMessage();
    }
4

2 回答 2

0

确保使用启用异常的 PDO::ERRMODE_EXCEPTION 创建数据库:

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

也 try 不应该包含 catch,它们应该在不同的块中。

try 
    {
    $this->core->conn->beginTransaction();

    $this->handle_item("remove", $item_id);
    $this->handle_item("add", $item_id);

    $this->core->conn->commit();
}//!!!
    catch (PDOException $e) 
    {
    $this->core->conn->rollBack();
    echo $e->getMessage();
    }
于 2013-05-11T19:34:54.467 回答
-1

不要将调用函数用于运行INSERTDELETE体内beginTransaction()beginTransaction()期望在它的主体中隐式地看到这些 Mysql 命令,而不是通过调用函数。所以在and之间隐式放置INSERTand命令。DELETEbeginTransaction()commit()

于 2013-05-11T19:21:38.953 回答