PDO在beginTransaction上失败

时间:2013-05-11 18:31:28

标签: php mysql pdo

我在几个执行查询的方法中使用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;
        }
    }

的BeginTransaction

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();
    }

2 个答案:

答案 0 :(得分: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));

也尝试不应该包含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();
    }

答案 1 :(得分:-1)

请勿使用调用函数在INSERT正文中运行DELETEbeginTransaction()beginTransaction()期望在其正文中隐式地看到这些Mysql命令,而不是通过调用函数。因此,在INSERTDELETE之间隐式添加beginTransaction()commit()命令。