我需要确保以下各项与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();
}
它将以这种方式回滚所有内容(包括以其他方法完成的查询)吗?还是只有直接查询?
答案 0 :(得分:1)
事务处理涉及数据库连接,而不涉及PHP代码单元。因此,使用该连接的任何查询都将受到交易的约束。
您必须小心,有时程序员会在(例如)类构造函数中创建自己的数据库连接,这意味着类方法可能正在使用自己的连接,因此不受您尝试控制的事务的约束。这也是传递数据库连接而不创建自己的数据库或不使用global
的原因。
尽管您还必须知道某些SQL语句会导致提交等。因此,请参考https://dev.mysql.com/doc/refman/5.6/en/sql-syntax-transactions.html,它将提供有关何时/何地/何地发生这些事件的更多详细信息。