同时使用多种方法和直接查询进行PDO事务处理?

时间:2019-05-06 01:47:07

标签: php mysql pdo transactions

我需要确保以下各项与PDO事务配合正常:

// Database Transaction
try
{
    // Start the transaction.
    $db->beginTransaction();

        // Some method in this class which runs a database query 
        $this->do_something($data);

        // Another method doing multiple database queries
        $this->do_another_thing($other_data);

        // Directly doing some query
        $stmt = $db->prepare("DELETE FROM `table` WHERE `time` < DATE_SUB(NOW(), INTERVAL :days DAY)");
        $stmt->execute(['days' => 2]);

    // Commit
    $db->commit();

}
catch(Exception $e)
{
    $error = $e->getMessage();
    // log

    // Rollback the transaction.
    $db->rollBack();
}

我的问题是:

它将以这种方式回滚所有内容(包括以其他方法完成的查询)吗?还是只有直接查询?

1 个答案:

答案 0 :(得分:1)

事务处理涉及数据库连接,而不涉及PHP代码单元。因此,使用该连接的任何查询都将受到交易的约束。

您必须小心,有时程序员会在(例如)类构造函数中创建自己的数据库连接,这意味着类方法可能正在使用自己的连接,因此不受您尝试控制的事务的约束。这也是传递数据库连接而不创建自己的数据库或不使用global的原因。

尽管您还必须知道某些SQL语句会导致提交等。因此,请参考https://dev.mysql.com/doc/refman/5.6/en/sql-syntax-transactions.html,它将提供有关何时/何地/何地发生这些事件的更多详细信息。