Транзакция PDO при одновременном использовании нескольких методов и прямых запросов? - PullRequest
0 голосов
/ 06 мая 2019

Мне нужно быть уверенным, что с транзакциями 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 Ответ

1 голос
/ 06 мая 2019

Транзакция охватывает соединение с базой данных, а не единицу кода PHP. Таким образом, любой запрос, который использует это соединение, будет предметом транзакции.

Вы должны быть осторожны, чтобы иногда программисты создавали свои собственные соединения с базой данных внутри (например) конструктора класса, что означает, что методы класса могут использовать свое собственное соединение и поэтому не подчиняются транзакции, которую вы пытаетесь контролировать. Это также является причиной передачи соединений с базой данных, а не создания собственных или использования global.

Хотя вы также должны знать, что определенные операторы SQL будут вызывать коммиты и т. Д. Так что обратитесь к https://dev.mysql.com/doc/refman/5.6/en/sql-syntax-transactions.html, который предоставит более подробную информацию о том, когда / что / где это может произойти.

...