【问题标题】:PDO Transaction while using multiple methods and direct queries together?PDO事务同时使用多种方法和直接查询?
【发布时间】:2019-09-23 15:48:03
【问题描述】:

我需要确保以下内容适用于 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();
}

我的问题是:

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

【问题讨论】:

    标签: php mysql pdo transactions


    【解决方案1】:

    事务涉及数据库连接,而不是 PHP 代码单元。因此,任何使用该连接的查询都将受到事务的影响。

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

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

    【讨论】:

    • 我在core.php 文件中创建了一个名为$db 的连接,然后使用$class-&gt;setDB($db); 将其传递给每个类,这样交易就可以了,对吧?
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2011-05-26
    相关资源
    最近更新 更多